openjournals / joss-reviews

Reviews for the Journal of Open Source Software
Creative Commons Zero v1.0 Universal
707 stars 37 forks source link

[REVIEW]: Motorcycle: A spectral boundary-integral method for seismic cycles on multiple faults #5097

Closed editorialbot closed 10 months ago

editorialbot commented 1 year ago

Submitting author: !--author-handle-->@sbarbot<!--end-author-handle-- (Sylvain Barbot) Repository: https://bitbucket.org/sbarbot/motorcycle/src/master/ Branch with paper.md (empty if default branch): Version: v1.0 Editor: !--editor-->@jedbrown<!--end-editor-- Reviewers: @mherman09, @willic3, @thehalfspace Archive: 10.5281/zenodo.10129331

Status

status

Status badge code:

HTML: <a href="https://joss.theoj.org/papers/fea1b49d635e7a0b90d27ebfa4c38c18"><img src="https://joss.theoj.org/papers/fea1b49d635e7a0b90d27ebfa4c38c18/status.svg"></a>
Markdown: [![status](https://joss.theoj.org/papers/fea1b49d635e7a0b90d27ebfa4c38c18/status.svg)](https://joss.theoj.org/papers/fea1b49d635e7a0b90d27ebfa4c38c18)

Reviewers and authors:

Please avoid lengthy details of difficulties in the review thread. Instead, please create a new issue in the target repository and link to those issues (especially acceptance-blockers) by leaving comments in the review thread below. (For completists: if the target issue tracker is also on GitHub, linking the review thread in the issue or vice versa will create corresponding breadcrumb trails in the link target.)

Reviewer instructions & questions

@mherman09 & @willic3, your review will be checklist based. Each of you will have a separate checklist that you should update when carrying out your review. First of all you need to run this command in a separate comment to create the checklist:

@editorialbot generate my checklist

The reviewer guidelines are available here: https://joss.readthedocs.io/en/latest/reviewer_guidelines.html. Any questions/concerns please let @jedbrown know.

✨ Please start on your review when you are able, and be sure to complete your review in the next six weeks, at the very latest ✨

Checklists

πŸ“ Checklist for @mherman09

πŸ“ Checklist for @willic3

πŸ“ Checklist for @thehalfspace

jedbrown commented 10 months ago

I don't think it's true that all executables need separate modules, but they can't have different modules with the same name as those used by different executables. Is it possible to have a single exportnetcdf and single types that all the binaries can use? Or is the issue that you have a strong commitment to subdirectories being entirely self-contained (which I think isn't really true since you need top-level CMakeLists.txt anyway).

sbarbot commented 10 months ago

Within 2d/antiplane/src-serial/, all the binaries motorcycle-ap-ratestate and motorcycle-ap-ratestate-bath use the module types.mod. However, the content of types.mod is different each time because of the use of pre-compiler directives. I can readily change that by naming the module types, and types_bath, respectively, using the same pre-compiler directives. That seems to work with CMake. However, CMake still complains when using make -j8 or ninja because of simple modules, such as exportnetcdf.mod, even though the latter is not modified for one binary or another. I am not sure what the underlying problem is and how to fix it.

jedbrown commented 10 months ago

I think the problem is that an exportnetcdf module is multiply defined. If these modules are the same, there should only be one. If they are different, they should have different names.

$ git grep 'MODULE exportnetcdf'
2d/antiplane/src-serial/exportnetcdf.f90:MODULE exportnetcdf
2d/antiplane/src-serial/exportnetcdf.f90:END MODULE exportnetcdf
2d/planestrain/src-serial/exportnetcdf.f90:MODULE exportnetcdf
2d/planestrain/src-serial/exportnetcdf.f90:END MODULE exportnetcdf
3d-serial/src/exportnetcdf.f90:MODULE exportnetcdf
3d-serial/src/exportnetcdf.f90:END MODULE exportnetcdf
3d/src/exportnetcdf.f90:MODULE exportnetcdf
3d/src/exportnetcdf.f90:END MODULE exportnetcdf

I know each executable only uses one of these, but CMake doesn't know how to tell the Fortran compiler to put the generated modules in different paths so there are race conditions. Effectively, CMake considers modules to be global names, but doesn't check that (though Ninja does).

sbarbot commented 10 months ago

I obtained partial success. Simply adding dependencies in CMakeLists.txt, as in

ADD_DEPENDENCIES(${BIN_BATH} ${BIN_CZ} ${BIN_AP})

allows parallel builds with cmake and make, as in

cmake .. make -j4

Using Ninja, I get more cryptic errors. First, the build complains about a redefinition of precompiler variables

50 | #define STATE_VECTOR_DGF 4 Warning: "STATE_VECTOR_DGF" redefined

This is suspicious because these variables are in #ifdef and #else flow controls, so a redefinition should not be possible.

Second, I obtain the fatal error

[84/140] Generating Fortran dyndep file 2d/antiplane/src-serial/CMakeFiles/motorcycle-ap-ratestate-cz-serial.dir/Fortran.dd ninja: build stopped: multiple rules generate 2d/antiplane/src-serial/types.mod.

I have not been able to trace the origin of this issue. It is confusing because the parallel build with make works.

I have also removed single and double quotes from Fortran's comments to avoid many warnings during the Ninja builds.

jedbrown commented 10 months ago

That's curious. When using makefiles, the command is

cd /home/jed/joss/motorcycle/build/3d/src && mpifort -DBATH -DNETCDF -I/usr/include -cpp -c /home/jed/joss/motorcycle/3d/src/macros.f90 -o CMakeFiles/motorcycle-3d-ratestate.dir/macros.f90.o

but when using Ninja, it is

mpifort -cpp -DBATH -DNETCDF -I/usr/include -J3d/src -cpp -E /home/jed/joss/motorcycle/3d/src/macros.f90 -o 3d/src/CMakeFiles/motorcycle-3d-ratestate.dir/macros.f90-pp.f90 && /usr/bin/cmake -E cmake_ninja_depends --tdi=3d/src/CMakeFiles/motorcycle-3d-ratestate.dir/FortranDependInfo.json --lang=Fortran --src=3d/src/CMakeFiles/motorcycle-3d-ratestate.dir/macros.f90-pp.f90 --out=3d/src/CMakeFiles/motorcycle-3d-ratestate.dir/macros.f90-pp.f90 --dep=3d/src/CMakeFiles/motorcycle-3d-ratestate.dir/macros.f90-pp.f90.d --obj=3d/src/CMakeFiles/motorcycle-3d-ratestate.dir/macros.f90.o --ddi=3d/src/CMakeFiles/motorcycle-3d-ratestate.dir/macros.f90.o.ddi 

mpifort -I/home/jed/joss/motorcycle/3d/src -I/usr/include -J3d/src -cpp -fpreprocessed -c 3d/src/CMakeFiles/motorcycle-3d-ratestate.dir/macros.f90-pp.f90 -o 3d/src/CMakeFiles/motorcycle-3d-ratestate.dir/macros.f90.o

The issue is that macros.f90 isn't meant to be a source file (it produces an empty macros.f90.o), but rather a header, so it shouldn't be a source. Below is a patch that renames it macros.h90 and gets it out of CMake sources (I just did project-wide rename; it should perhaps be removed from makefiles). It builds clean with make and ninja gets further, but still has this issue, which I believe is because the dependency you stated results in multiply-defined modules. You should be able to get rid of the new dependency and just make the module names unique.

ninja: build stopped: multiple rules generate 2d/antiplane/src-serial/types.mod
```diff diff --git i/2d/antiplane/common.mk w/2d/antiplane/common.mk index b20784e..823aaa5 100644 --- i/2d/antiplane/common.mk +++ w/2d/antiplane/common.mk @@ -1,14 +1,14 @@ -OBJRS=$(SRC)/macros.f90 $(patsubst %,$(DST)/%, \ +OBJRS=$(SRC)/macros.h90 $(patsubst %,$(DST)/%, \ getopt_m.o types.o getdata.o \ greens.o exportnetcdf.o fft.o \ ode45.o ratestate.o ) -OBJCZ=$(SRC)/macros.f90 $(patsubst %,$(DST)/%, \ +OBJCZ=$(SRC)/macros.h90 $(patsubst %,$(DST)/%, \ getopt_m.o types.o getdata.o \ greens.o exportnetcdf.o fft.o \ ode45.o ratestate_cz.o ) -OBJTH=$(SRC)/macros.f90 $(patsubst %,$(DST)/%, \ +OBJTH=$(SRC)/macros.h90 $(patsubst %,$(DST)/%, \ getopt_m.o types.o getdata.o \ greens.o exportnetcdf.o fft.o \ ode45.o ratestate_bath.o ) @@ -18,19 +18,19 @@ $(shell mkdir -p $(DST)) $(DST)/%.o:$(SRC)/%.c $(COMPILE.c) $^ -o $(DST)/$*.o -$(DST)/%.o: $(SRC)/%.f $(SRC)/macros.f90 - $(COMPILE.f) $(filter-out $(SRC)/macros.f90,$^) -o $(DST)/$*.o +$(DST)/%.o: $(SRC)/%.f $(SRC)/macros.h90 + $(COMPILE.f) $(filter-out $(SRC)/macros.h90,$^) -o $(DST)/$*.o $(DST)/%.o: $(SRC)/%.f90 - $(COMPILE.f) $(filter-out $(SRC)/macros.f90,$^) -o $(DST)/$*.o -J $(DST) + $(COMPILE.f) $(filter-out $(SRC)/macros.h90,$^) -o $(DST)/$*.o -J $(DST) -motorcycle-ap-ratestate-serial: $(filter-out $(SRC)/macros.f90,$(OBJRS)) +motorcycle-ap-ratestate-serial: $(filter-out $(SRC)/macros.h90,$(OBJRS)) $(LINK.f) -o $(DST)/$@ $^ $(LIBS) -motorcycle-ap-ratestate-compliant-serial: $(filter-out $(SRC)/macros.f90,$(OBJCZ)) +motorcycle-ap-ratestate-compliant-serial: $(filter-out $(SRC)/macros.h90,$(OBJCZ)) $(LINK.f) -o $(DST)/$@ $^ $(LIBS) -motorcycle-ap-ratestate-bath-serial: $(filter-out $(SRC)/macros.f90,$(OBJTH)) +motorcycle-ap-ratestate-bath-serial: $(filter-out $(SRC)/macros.h90,$(OBJTH)) $(LINK.f) -o $(DST)/$@ $^ $(LIBS) clean: diff --git i/2d/antiplane/src-serial/CMakeLists.txt w/2d/antiplane/src-serial/CMakeLists.txt index a94ced6..4a35bd0 100644 --- i/2d/antiplane/src-serial/CMakeLists.txt +++ w/2d/antiplane/src-serial/CMakeLists.txt @@ -5,7 +5,7 @@ MESSAGE("-- Processing " ${BIN}) INCLUDE_DIRECTORIES(${NETCDF_INCLUDES} ${FFTW_INCLUDES}) -SET(SRC_FILE_LIST "macros.f90;types.f90;fft.f90;getdata.f;getopt_m.f90;greens.f90") +SET(SRC_FILE_LIST "types.f90;fft.f90;getdata.f;getopt_m.f90;greens.f90") IF (USE_NETCDF) MESSAGE("-- " ${BIN} ": Using NetCDF") diff --git i/2d/antiplane/src-serial/greens.f90 w/2d/antiplane/src-serial/greens.f90 index 1d973a9..7f91940 100644 --- i/2d/antiplane/src-serial/greens.f90 +++ w/2d/antiplane/src-serial/greens.f90 @@ -19,7 +19,7 @@ MODULE greens -#include "macros.f90" +#include "macros.h90" USE types diff --git i/2d/antiplane/src-serial/ode23.f90 w/2d/antiplane/src-serial/ode23.f90 index 6bab003..3e5b095 100644 --- i/2d/antiplane/src-serial/ode23.f90 +++ w/2d/antiplane/src-serial/ode23.f90 @@ -17,7 +17,7 @@ ! along with MOTORCYCLE. If not, see . !----------------------------------------------------------------------- -#include "macros.f90" +#include "macros.h90" MODULE ode23 diff --git i/2d/antiplane/src-serial/ode45.f90 w/2d/antiplane/src-serial/ode45.f90 index 49b5ed3..b78e210 100644 --- i/2d/antiplane/src-serial/ode45.f90 +++ w/2d/antiplane/src-serial/ode45.f90 @@ -17,7 +17,7 @@ ! along with MOTORCYCLE. If not, see . !----------------------------------------------------------------------- -#include "macros.f90" +#include "macros.h90" MODULE ode45 diff --git i/2d/antiplane/src-serial/ratestate.f90 w/2d/antiplane/src-serial/ratestate.f90 index 09fde29..983888b 100644 --- i/2d/antiplane/src-serial/ratestate.f90 +++ w/2d/antiplane/src-serial/ratestate.f90 @@ -62,7 +62,7 @@ !---------------------------------------------------------------------- PROGRAM ratestate -#include "macros.f90" +#include "macros.h90" #ifdef NETCDF USE exportnetcdf diff --git i/2d/antiplane/src-serial/ratestate_bath.f90 w/2d/antiplane/src-serial/ratestate_bath.f90 index c3fd167..fc4ea49 100644 --- i/2d/antiplane/src-serial/ratestate_bath.f90 +++ w/2d/antiplane/src-serial/ratestate_bath.f90 @@ -59,7 +59,7 @@ PROGRAM ratestate #define BATH 1 -#include "macros.f90" +#include "macros.h90" #ifdef NETCDF USE exportnetcdf diff --git i/2d/antiplane/src-serial/ratestate_cz.f90 w/2d/antiplane/src-serial/ratestate_cz.f90 index ecc5135..0833d61 100644 --- i/2d/antiplane/src-serial/ratestate_cz.f90 +++ w/2d/antiplane/src-serial/ratestate_cz.f90 @@ -46,7 +46,7 @@ !---------------------------------------------------------------------- PROGRAM ratestate_cz -#include "macros.f90" +#include "macros.h90" #ifdef NETCDF USE exportnetcdf diff --git i/2d/antiplane/src-serial/types.f90 w/2d/antiplane/src-serial/types.f90 index 6d7c4b2..54c7459 100644 --- i/2d/antiplane/src-serial/types.f90 +++ w/2d/antiplane/src-serial/types.f90 @@ -17,7 +17,7 @@ ! along with MOTORCYCLE. If not, see . !----------------------------------------------------------------------- -#include "macros.f90" +#include "macros.h90" MODULE types diff --git i/2d/planestrain/common.mk w/2d/planestrain/common.mk index 97d9ba3..aafa566 100644 --- i/2d/planestrain/common.mk +++ w/2d/planestrain/common.mk @@ -1,5 +1,5 @@ -OBJRS=$(SRC)/macros.f90 $(patsubst %,$(DST)/%, \ +OBJRS=$(SRC)/macros.h90 $(patsubst %,$(DST)/%, \ getopt_m.o types.o getdata.o \ greens.o exportnetcdf.o fft.o \ ode45.o ratestate.o ) @@ -9,16 +9,16 @@ $(shell mkdir -p $(DST)) $(DST)/%.o:$(SRC)/%.c $(COMPILE.c) $(CFLAGS) -c $^ -o $(DST)/$*.o -$(DST)/%.o: $(SRC)/%.f $(SRC)/macros.f90 - $(COMPILE.f) $(F77FLAGS) -c $(filter-out $(SRC)/macros.f90,$^) -o $(DST)/$*.o +$(DST)/%.o: $(SRC)/%.f $(SRC)/macros.h90 + $(COMPILE.f) $(F77FLAGS) -c $(filter-out $(SRC)/macros.h90,$^) -o $(DST)/$*.o $(DST)/%.o: $(SRC)/%.f90 - $(COMPILE.f) $(F90FLAGS) -c $(filter-out $(SRC)/macros.f90,$^) -o $(DST)/$*.o -J $(DST) + $(COMPILE.f) $(F90FLAGS) -c $(filter-out $(SRC)/macros.h90,$^) -o $(DST)/$*.o -J $(DST) $(DST)/%.o: $(SRC)/%.cpp $(COMPILE.f) $(CXXFLAGS) -c $^ -o $(DST)/$*.o -motorcycle-ps-ratestate-serial: $(filter-out $(SRC)/macros.f90,$(OBJRS)) +motorcycle-ps-ratestate-serial: $(filter-out $(SRC)/macros.h90,$(OBJRS)) $(LINK.f) -o $(DST)/$@ $^ $(LIBS) clean: diff --git i/2d/planestrain/src-serial/CMakeLists.txt w/2d/planestrain/src-serial/CMakeLists.txt index 17542d2..1413bc7 100644 --- i/2d/planestrain/src-serial/CMakeLists.txt +++ w/2d/planestrain/src-serial/CMakeLists.txt @@ -5,7 +5,7 @@ MESSAGE("-- Processing " ${BIN}) INCLUDE_DIRECTORIES(${NETCDF_INCLUDES} ${FFTW_INCLUDES}) -SET(SRC_FILE_LIST "macros.f90;types.f90;fft.f90;getdata.f;getopt_m.f90;greens.f90;ratestate.f90") +SET(SRC_FILE_LIST "types.f90;fft.f90;getdata.f;getopt_m.f90;greens.f90;ratestate.f90") IF (USE_NETCDF) MESSAGE("-- " ${BIN} ": Using NetCDF") diff --git i/2d/planestrain/src-serial/ode23.f90 w/2d/planestrain/src-serial/ode23.f90 index 6bab003..3e5b095 100644 --- i/2d/planestrain/src-serial/ode23.f90 +++ w/2d/planestrain/src-serial/ode23.f90 @@ -17,7 +17,7 @@ ! along with MOTORCYCLE. If not, see . !----------------------------------------------------------------------- -#include "macros.f90" +#include "macros.h90" MODULE ode23 diff --git i/2d/planestrain/src-serial/ode45.f90 w/2d/planestrain/src-serial/ode45.f90 index 49b5ed3..b78e210 100644 --- i/2d/planestrain/src-serial/ode45.f90 +++ w/2d/planestrain/src-serial/ode45.f90 @@ -17,7 +17,7 @@ ! along with MOTORCYCLE. If not, see . !----------------------------------------------------------------------- -#include "macros.f90" +#include "macros.h90" MODULE ode45 diff --git i/2d/planestrain/src-serial/ratestate.f90 w/2d/planestrain/src-serial/ratestate.f90 index 34a73d4..beb639e 100644 --- i/2d/planestrain/src-serial/ratestate.f90 +++ w/2d/planestrain/src-serial/ratestate.f90 @@ -55,7 +55,7 @@ !---------------------------------------------------------------------- PROGRAM ratestate -#include "macros.f90" +#include "macros.h90" #ifdef NETCDF USE exportnetcdf diff --git i/2d/planestrain/src-serial/types.f90 w/2d/planestrain/src-serial/types.f90 index bbf7ac4..7a20085 100644 --- i/2d/planestrain/src-serial/types.f90 +++ w/2d/planestrain/src-serial/types.f90 @@ -17,7 +17,7 @@ ! along with MOTORCYCLE. If not, see . !----------------------------------------------------------------------- -#include "macros.f90" +#include "macros.h90" MODULE types diff --git i/3d-serial/common.mk w/3d-serial/common.mk index 347b70d..699e8d2 100644 --- i/3d-serial/common.mk +++ w/3d-serial/common.mk @@ -1,10 +1,10 @@ -OBJRS=$(SRC)/macros.f90 $(patsubst %,$(DST)/%, \ +OBJRS=$(SRC)/macros.h90 $(patsubst %,$(DST)/%, \ getopt_m.o types.o getdata.o \ greens.o exportnetcdf.o fft.o \ ode45.o ode23.o ratestate.o ) -OBJTH=$(SRC)/macros.f90 $(patsubst %,$(DST)/%, \ +OBJTH=$(SRC)/macros.h90 $(patsubst %,$(DST)/%, \ getopt_m.o types.o getdata.o \ greens.o exportnetcdf.o fft.o \ ode45.o ode23.o ratestate_bath.o ) @@ -14,16 +14,16 @@ $(shell mkdir -p $(DST)) $(DST)/%.o:$(SRC)/%.c $(COMPILE.c) $(CFLAGS) $^ -o $(DST)/$*.o -$(DST)/%.o: $(SRC)/%.f $(SRC)/macros.f90 - $(COMPILE.f) $(F77FLAGS) $(filter-out $(SRC)/macros.f90,$^) -o $(DST)/$*.o +$(DST)/%.o: $(SRC)/%.f $(SRC)/macros.h90 + $(COMPILE.f) $(F77FLAGS) $(filter-out $(SRC)/macros.h90,$^) -o $(DST)/$*.o -$(DST)/%.o: $(SRC)/%.f90 $(SRC)/macros.f90 - $(COMPILE.f) $(F90FLAGS) $(filter-out $(SRC)/macros.f90,$^) -o $(DST)/$*.o -J $(DST) +$(DST)/%.o: $(SRC)/%.f90 $(SRC)/macros.h90 + $(COMPILE.f) $(F90FLAGS) $(filter-out $(SRC)/macros.h90,$^) -o $(DST)/$*.o -J $(DST) $(DST)/%.o: $(SRC)/%.cpp $(COMPILE.f) $(CXXFLAGS) $^ -o $(DST)/$*.o -motorcycle-3d-ratestate-serial: $(filter-out $(SRC)/macros.f90,$(OBJRS)) +motorcycle-3d-ratestate-serial: $(filter-out $(SRC)/macros.h90,$(OBJRS)) $(LINK.f) -o $(DST)/$@ $^ $(LIBS) motorcycle-3d-ratestate-bath-serial: $(OBJTH) diff --git i/3d-serial/src/CMakeLists.txt w/3d-serial/src/CMakeLists.txt index 8d5909f..dcf9af4 100644 --- i/3d-serial/src/CMakeLists.txt +++ w/3d-serial/src/CMakeLists.txt @@ -5,7 +5,7 @@ MESSAGE("-- Processing " ${BIN}) INCLUDE_DIRECTORIES(${NETCDF_INCLUDES} ${FFTW_INCLUDES}) -SET(SRC_FILE_LIST "macros.f90;types.f90;fft.f90;getdata.f;getopt_m.f90;ode45.f90;greens.f90;ratestate.f90") +SET(SRC_FILE_LIST "types.f90;fft.f90;getdata.f;getopt_m.f90;ode45.f90;greens.f90;ratestate.f90") IF (USE_NETCDF) MESSAGE("-- " ${BIN} ": Using NetCDF") diff --git i/3d-serial/src/ode23.f90 w/3d-serial/src/ode23.f90 index 6bab003..3e5b095 100644 --- i/3d-serial/src/ode23.f90 +++ w/3d-serial/src/ode23.f90 @@ -17,7 +17,7 @@ ! along with MOTORCYCLE. If not, see . !----------------------------------------------------------------------- -#include "macros.f90" +#include "macros.h90" MODULE ode23 diff --git i/3d-serial/src/ode45.f90 w/3d-serial/src/ode45.f90 index 49b5ed3..b78e210 100644 --- i/3d-serial/src/ode45.f90 +++ w/3d-serial/src/ode45.f90 @@ -17,7 +17,7 @@ ! along with MOTORCYCLE. If not, see . !----------------------------------------------------------------------- -#include "macros.f90" +#include "macros.h90" MODULE ode45 diff --git i/3d-serial/src/ratestate.f90 w/3d-serial/src/ratestate.f90 index 47b79ab..4d1f0f5 100644 --- i/3d-serial/src/ratestate.f90 +++ w/3d-serial/src/ratestate.f90 @@ -58,7 +58,7 @@ !---------------------------------------------------------------------- PROGRAM ratestate -#include "macros.f90" +#include "macros.h90" #ifdef NETCDF USE exportnetcdf diff --git i/3d-serial/src/types.f90 w/3d-serial/src/types.f90 index 5a449ad..7827f26 100644 --- i/3d-serial/src/types.f90 +++ w/3d-serial/src/types.f90 @@ -17,7 +17,7 @@ ! along with MOTORCYCLE. If not, see . !----------------------------------------------------------------------- -#include "macros.f90" +#include "macros.h90" MODULE types diff --git i/3d/common.mk w/3d/common.mk index c004c26..ba76156 100644 --- i/3d/common.mk +++ w/3d/common.mk @@ -1,10 +1,10 @@ -OBJRS=$(SRC)/macros.f90 $(patsubst %,$(DST)/%, \ +OBJRS=$(SRC)/macros.h90 $(patsubst %,$(DST)/%, \ getopt_m.o types.o getdata.o \ greens.o exportnetcdf.o fft.o \ ode45.o ratestate.o ) -OBJTH=$(SRC)/macros.f90 $(patsubst %,$(DST)/%, \ +OBJTH=$(SRC)/macros.h90 $(patsubst %,$(DST)/%, \ getopt_m.o types.o getdata.o \ greens.o exportnetcdf.o fft.o \ ode45.o ratestate_bath.o ) @@ -14,16 +14,16 @@ $(shell mkdir -p $(DST)) $(DST)/%.o:$(SRC)/%.c $(COMPILE.c) $(CFLAGS) $^ -o $(DST)/$*.o -$(DST)/%.o: $(SRC)/%.f $(SRC)/macros.f90 - $(COMPILE.f) $(F77FLAGS) $(filter-out $(SRC)/macros.f90,$^) -o $(DST)/$*.o +$(DST)/%.o: $(SRC)/%.f $(SRC)/macros.h90 + $(COMPILE.f) $(F77FLAGS) $(filter-out $(SRC)/macros.h90,$^) -o $(DST)/$*.o -$(DST)/%.o: $(SRC)/%.f90 $(SRC)/macros.f90 - $(COMPILE.f) $(F90FLAGS) $(filter-out $(SRC)/macros.f90,$^) -o $(DST)/$*.o -J $(DST) +$(DST)/%.o: $(SRC)/%.f90 $(SRC)/macros.h90 + $(COMPILE.f) $(F90FLAGS) $(filter-out $(SRC)/macros.h90,$^) -o $(DST)/$*.o -J $(DST) $(DST)/%.o: $(SRC)/%.cpp $(COMPILE.f) $(CXXFLAGS) $^ -o $(DST)/$*.o -motorcycle-3d-ratestate: $(filter-out $(SRC)/macros.f90,$(OBJRS)) +motorcycle-3d-ratestate: $(filter-out $(SRC)/macros.h90,$(OBJRS)) $(LINK.f) -o $(DST)/$@ $^ $(LIBS) motorcycle-3d-ratestate-bath: $(OBJTH) diff --git i/3d/src/CMakeLists.txt w/3d/src/CMakeLists.txt index a5e2f52..74683f7 100644 --- i/3d/src/CMakeLists.txt +++ w/3d/src/CMakeLists.txt @@ -14,8 +14,7 @@ IF (MPI_FOUND) ENDIF() INCLUDE_DIRECTORIES(${NETCDF_INCLUDES} ${FFTW_INCLUDES}) - -SET(SRC_FILE_LIST "macros.f90;types.f90;fft.f90;getdata.f;getopt_m.f90;ode45.f90;greens.f90") +SET(SRC_FILE_LIST "types.f90;fft.f90;getdata.f;getopt_m.f90;ode45.f90;greens.f90") IF (USE_NETCDF) MESSAGE("-- " ${BIN} ": Using NetCDF") diff --git i/3d/src/ode45.f90 w/3d/src/ode45.f90 index 3f7da01..81a23dd 100644 --- i/3d/src/ode45.f90 +++ w/3d/src/ode45.f90 @@ -17,7 +17,7 @@ ! along with UNICYCLE. If not, see . !----------------------------------------------------------------------- -#include "macros.f90" +#include "macros.h90" MODULE ode45 diff --git i/3d/src/ratestate.f90 w/3d/src/ratestate.f90 index 753a29e..7075d34 100644 --- i/3d/src/ratestate.f90 +++ w/3d/src/ratestate.f90 @@ -79,7 +79,7 @@ !---------------------------------------------------------------------- PROGRAM ratestate -#include "macros.f90" +#include "macros.h90" #ifdef NETCDF USE exportnetcdf diff --git i/3d/src/ratestate_bath.f90 w/3d/src/ratestate_bath.f90 index 8fd2243..d4eb7c1 100644 --- i/3d/src/ratestate_bath.f90 +++ w/3d/src/ratestate_bath.f90 @@ -86,7 +86,7 @@ PROGRAM ratestate_bath #define BATH 1 -#include "macros.f90" +#include "macros.h90" #ifdef NETCDF USE exportnetcdf diff --git i/3d/src/types.f90 w/3d/src/types.f90 index e1cfc65..17b6c1b 100644 --- i/3d/src/types.f90 +++ w/3d/src/types.f90 @@ -17,7 +17,7 @@ ! along with MOTORCYCLE. If not, see . !----------------------------------------------------------------------- -#include "macros.f90" +#include "macros.h90" MODULE types ```
sbarbot commented 10 months ago

I moved all common files and functions to a shared library, changed all macros.f90 to macros.h90 as suggested, and renamed the module files that perform different functions, for example with types_ap.f90 and types_ps.f90. The configuration and installation now work with

cmake .. make -j4

and with

cmake -G Ninja .. ninja -j1

The key to making Ninja work is to declare Fortran module files as formal libraries, as in ADD_LIBRARY("types_aplib" "types_ap.f90") followed by TARGET_LINK_LIBRARIES(bin types_aplib). Loading the shared library of modules into other CMakeLists.txt files is simply accomplished by INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/share/src), noting that CMake does not move the .mod files to share/lib as is done with individual makefiles.

However, a race condition occurs with ninja -j4, despite including DEPENDENCIES and ORDERED_TARGETS statements in the relevant CMakeLists.txt files. I don't know how to go around this remaining issue.

sbarbot commented 10 months ago

I fixed an error due to an oversight during file migration. The code now passes the tests in the bitbucket pipeline. The code is ready to go unless you have suggestions to enable the multi-threaded ninja build.

jedbrown commented 10 months ago

I seem to have gotten parallel ninja motorcycle-3d-ratestate working with this approach. It appears that ADD_DEPENDENCIES doesn't place a prerequisite on compilation of object files, but only on linking.

diff --git c/3d/src/CMakeLists.txt w/3d/src/CMakeLists.txt
index 7c75e35..d77f049 100644
--- c/3d/src/CMakeLists.txt
+++ w/3d/src/CMakeLists.txt
@@ -32,15 +32,14 @@ SET(ORDERED_TARGETS "types_3dlib" "fft2d_mpilib" "greens_3dlib")
 ADD_LIBRARY("types_3dlib" "types_3d.f90")

 ADD_LIBRARY("fft2d_mpilib" "fft2d_mpi.f90")
-ADD_DEPENDENCIES(fft2d_mpilib types_3dlib)
 IF (USE_OPENMP)
-  TARGET_LINK_LIBRARIES(fft2d_mpilib ${FFTW_OMP_LIBRARIES} ${FFTW_LIBRARIES})
+  TARGET_LINK_LIBRARIES(fft2d_mpilib ${FFTW_OMP_LIBRARIES} ${FFTW_LIBRARIES} types_3dlib)
 ELSE()
-  TARGET_LINK_LIBRARIES(fft2d_mpilib ${FFTW_LIBRARIES})
+  TARGET_LINK_LIBRARIES(fft2d_mpilib ${FFTW_LIBRARIES} types_3dlib)
 ENDIF()

 ADD_LIBRARY("greens_3dlib" "greens_3d.f90")
-ADD_DEPENDENCIES(greens_3dlib types_3dlib)
+TARGET_LINK_LIBRARIES(greens_3dlib types_3dlib)

 ADD_LIBRARY("ode45_mpilib" "ode45_mpi.f90")
sbarbot commented 10 months ago

Amazing. I propagated the same hack to the other CMakeLists.txt files. All is working now.

jedbrown commented 10 months ago

Cool. I think there are a couple more places that need this change to fix the race condition. Running ninja clean && ninja -j32 a few times turns these up.

FAILED: 3d-serial/src/CMakeFiles/greens_3d_seriallib.dir/greens_3d_serial.f90.o 3d-serial/src/greens_3d_serial.mod
/usr/bin/f95 -I/home/jed/joss/motorcycle/3d-serial/src -I/usr/include -I/home/jed/joss/motorcycle/build-nj/share/src -J3d-serial/src -cpp -fpreprocessed -c 3d-serial/src/CMakeFiles/greens_3d_seriallib.dir/greens_3d_serial.f90-pp.f90 -o 3d-serial/src/CMakeFiles/greens_3d_seriallib.dir/greens_3d_serial.f90.o
/home/jed/joss/motorcycle/3d-serial/src/greens_3d_serial.f90:22:7:

   22 |   USE types_3d_serial
      |       1
Fatal Error: Cannot open module file β€˜types_3d_serial.mod’ for reading at (1): No such file or directory
FAILED: 2d/antiplane/src-serial/CMakeFiles/greens_ap_bathlib.dir/greens_ap_bath.f90.o 2d/antiplane/src-serial/greens_ap_bath.mod
/usr/bin/f95 -I/home/jed/joss/motorcycle/2d/antiplane/src-serial -I/usr/include -I/home/jed/joss/motorcycle/build-nj/share/src -J2d/antiplane/src-serial -cpp -fpreprocessed -c 2d/antiplane/src-serial/CMakeFiles/greens_ap_bathlib.dir/greens_ap_bath.f90-pp.f90 -o 2d/antiplane/src-serial/CMakeFiles/greens_ap_bathlib.dir/greens_ap_bath.f90.o
/home/jed/joss/motorcycle/2d/antiplane/src-serial/greens_ap_bath.f90:24:7:

   24 |   USE types_ap_bath
      |       1
Fatal Error: Cannot open module file β€˜types_ap_bath.mod’ for reading at (1): No such file or directory
jedbrown commented 10 months ago

@editorialbot generate pdf

editorialbot commented 10 months ago

:point_right::page_facing_up: Download article proof :page_facing_up: View article proof on GitHub :page_facing_up: :point_left:

jedbrown commented 10 months ago

The paper looks good, but the citation standard requires journal names to be spelled out (not J. Geophys. Res. or Epsl).

More seriously, I just noticed that you have what appears to be transcribed code from Numerical Recipes (not clean re-implementations). Unfortunately, the NR license is very restrictive and not open source. https://en.wikipedia.org/wiki/Numerical_Recipes#License

sbarbot commented 10 months ago

What is the best course of action to deal with the numerical recipe code?

jedbrown commented 10 months ago

Outside of obtaining a compatible open source license for that code, it needs to be removed. Replaced either with an open source library, a clean re-implementation, or code copied with attribution from a compatibly-licensed open source project.

sbarbot commented 10 months ago

I produced a clean implementation of the Runge-Kutta solvers. I merged ode23 and ode45 into a single a new module called rk, where the adaptive time step procedure calls timeStep23 or timeStep45 based on the function provided by the caller. I updated the make and cmake files accordingly.

I fixed the bibliography.

I fixed the race condition with the remaining libraries. Running ninja -j32 multiple times does not generate any error anymore.

jedbrown commented 10 months ago

@editorialbot generate pdf

editorialbot commented 10 months ago

:point_right::page_facing_up: Download article proof :page_facing_up: View article proof on GitHub :page_facing_up: :point_left:

jedbrown commented 10 months ago

Cascadia needs protection and Cambridge University Press should be title case.

I looked at your "clean implementation" and I can't bring myself to believe it is what you say it is and I don't think a court would believe it either. (It may be unlikely that you or a user of your software would be taken to court, but I can't recommend something I believe to be a license violation for publication.) Renaming variables or even more aggressive refactoring of an existing implementation does not constitute a clean implementation. Indeed, doing so without preserving the original license shows intent to obfuscate a license violation.

A clean implementation means giving someone who has not seen the IP-encumbered implementation a blank file and a textbook/paper with the relevant equations. Sometimes one who has seen the IP-encumbered code (perhaps long ago) can put themselves in a mental state that there will be no resemblance, but you've been touching this code today. An alternative would be to port an existing implementation while complying with the terms of its license (e.g., PETSc's explicit RK is BSD-2-Clause; see also Julia and Python implementations). I know this isn't pleasant, but the NR authors chose to poison their license and the fact that many scientists violate it doesn't make it less of a violation.

sbarbot commented 10 months ago

I cleaned the bibliography.

The only lines of code for the Runge-Kutta integration are in rk.f90 with

ytmp = yin + dt*B21*dydt CALL odefun(n,t+A2*dt,ytmp,buffer2) ytmp = yin + dt*(B31*dydt + B32*buffer2) ... CALL odefun(n,t+A6*dt,ytmp,buffer6) yout = yin + dt*(C1*dydt + C3*buffer3 + C4*buffer4 + C6*buffer6) yerr = dt*(DC1*dydt + DC3*buffer3 + DC4*buffer4 + DC5*buffer5 + DC6*buffer6)

for the 4/5th integration, and

ytmp = yin + dt*B11*dydt ... CALL odefun(n,t+dt*A3,yout,buffer4) yerr = dt*(E1*dydt + E2*buffer2 + E3*buffer3 + E4*buffer4)

for the 2/3rd integration. There are similar implementations in https://people.math.sc.edu/Burkardt/f_src/rk4/rk4.html or https://github.com/jacobwilliams/rklib/blob/master/src/rklib_variable_steps.f90 that are unrelated to numerical recipes. It is difficult to implement it differently because this is just simple mathematics.

The code in the subroutine rungeKutta differs from the Numerical Recipes textbook because it enforces a maximum time step. If I borrow another routine from the community and change it to fit my environment, it will look very much like it is now, maybe with just some different variable names. So I'm not sure how to proceed. If I change to a different quadrature method, it will break published benchmarks. But I don't think using mathematical results is a break of license.

jedbrown commented 10 months ago

If this were to end up in court, the lawyers would show the before and after (see below) in which you changed a couple variable names and stripped the attribution, but with identical formatting all the way down to whitespace. The court would surely find it clear that you copied and substituted a couple names, and I would presumably be asked why I accepted your assertion that it was a clean reimplementation. Sure, it's "just math", but provenance matters and a clean implementation would not be this similar, thus making the process of license violation very clear. I linked an example implementation in which a single stepping routine works for any tabulated method -- it looks nothing like your implementation despite being the same math (for the same tabulated coefficients). You might say "whatever, any implementation would do the same thing", but the legal issue at stake is one of process. And since only you have your hands on the keyboard, it is one of trust.

Suppose you were an editor handling a regular journal submission that has a lengthy quote from another source. The journal officials inform you that the quote is too long to be considered fair use and so you ask the authors to rewrite that section. They respond by removing it from the quote environment, drop the citation, and swap a couple synonyms, then tell you it was completely rewritten. Any reader (or automated tool, for that matter) would flag it as plagiarism. Surely you would feel that is a breach of trust -- they very plainly obfuscated their plagiarism and made false statements that it was rewritten. How would you handle it?

Before

  !------------------------------------------------------------------------------
  !       FIFTH-ORDER RUNGE-KUTTA  : ALGORITHM ROUTINE
  !       SEE NUMERICAL RECIPES 2ND. ED. P.713
  !------------------------------------------------------------------------------
  SUBROUTINE RKCKm(n,t,yin,dydt,h,yout,yerr,ytmp,odefun)

    IMPLICIT NONE

    INTEGER, INTENT(IN)   :: n
    REAL*8, INTENT(IN)    :: t,h
    REAL*8, INTENT(INOUT) :: yin(n),dydt(n), &
                             yout(n),yerr(n),ytmp(n)
    EXTERNAL :: odefun

    REAL*8, PARAMETER :: A2=0.2d0, A3=0.3d0, A4=0.6d0, A5=1.d0, A6=0.875d0
    REAL*8, PARAMETER :: B21=0.2d0, B31=3.d0/40.d0, B32=9.d0/40.d0
    REAL*8, PARAMETER :: B41=0.3d0, B42=-0.9d0, B43=1.2d0
    REAL*8, PARAMETER :: B51=-11.d0/54.d0, B52=2.5d0, B53=-70.d0/27.d0, B54=35.d0/27.d0
    REAL*8, PARAMETER :: B61=1631.d0/55296.d0,   B62=175.d0/512.d0, B63=575.d0/13824.d0, &
                         B64=44275.d0/110592.d0, B65=253.d0/4096.d0
    REAL*8, PARAMETER :: C1=37.d0/378.d0, C3=250.d0/621.d0, C4=125.d0/594.d0, C6=512.d0/1771.d0
    REAL*8, PARAMETER :: DC1=C1-2825.d0/27648.d0,  DC3=C3-18575.d0/48384.d0, &
                         DC4=C4-13525.d0/55296.d0, DC5=-277.d0/14336.d0, DC6=C6-0.25d0

    ytmp = yin + h*B21*dydt
    CALL odefun(n,t+A2*h,ytmp,AK2)

    ytmp = yin + h*(B31*dydt + B32*AK2)
    CALL odefun(n,t+A3*h,ytmp,AK3)

    ytmp = yin + h*(B41*dydt + B42*AK2 + B43*AK3)
    CALL odefun(n,t+A4*h,ytmp,AK4)

    ytmp = yin + h*(B51*dydt + B52*AK2 + B53*AK3 + B54*AK4)
    CALL odefun(n,t+A5*h,ytmp,AK5)

    ytmp = yin + h*(B61*dydt + B62*AK2 + B63*AK3 + B64*AK4 + B65*AK5)
    CALL odefun(n,t+A6*h,ytmp,AK6)

    yout = yin + h*(C1*dydt + C3*AK3 + C4*AK4 + C6*AK6)
    yerr = h*(DC1*dydt + DC3*AK3 + DC4*AK4 + DC5*AK5 + DC6*AK6)

  END SUBROUTINE RKCKm

After

  !------------------------------------------------------------------------------
  !> subroutine timeStep45
  !  conducts 4/5th-order accurate forward time step based on forward model odefun
  !------------------------------------------------------------------------------
  SUBROUTINE timeStep45(n,t,yin,dydt,dt,yout,yerr,ytmp,odefun)

    IMPLICIT NONE

    INTEGER, INTENT(IN)   :: n
    REAL*8, INTENT(IN)    :: t,dt
    REAL*8, INTENT(INOUT) :: yin(n),dydt(n), &
                             yout(n),yerr(n),ytmp(n)
    EXTERNAL :: odefun

    REAL*8, PARAMETER :: A2=0.2d0, A3=0.3d0, A4=0.6d0, A5=1.d0, A6=0.875d0
    REAL*8, PARAMETER :: B21=0.2d0, B31=3.d0/40.d0, B32=9.d0/40.d0
    REAL*8, PARAMETER :: B41=0.3d0, B42=-0.9d0, B43=1.2d0
    REAL*8, PARAMETER :: B51=-11.d0/54.d0, B52=2.5d0, B53=-70.d0/27.d0, B54=35.d0/27.d0
    REAL*8, PARAMETER :: B61=1631.d0/55296.d0,   B62=175.d0/512.d0, B63=575.d0/13824.d0, &
                         B64=44275.d0/110592.d0, B65=253.d0/4096.d0
    REAL*8, PARAMETER :: C1=37.d0/378.d0, C3=250.d0/621.d0, C4=125.d0/594.d0, C6=512.d0/1771.d0
    REAL*8, PARAMETER :: DC1=C1-2825.d0/27648.d0,  DC3=C3-18575.d0/48384.d0, &
                         DC4=C4-13525.d0/55296.d0, DC5=-277.d0/14336.d0, DC6=C6-0.25d0

    ytmp = yin + dt*B21*dydt
    CALL odefun(n,t+A2*dt,ytmp,buffer2)

    ytmp = yin + dt*(B31*dydt + B32*buffer2)
    CALL odefun(n,t+A3*dt,ytmp,buffer3)

    ytmp = yin + dt*(B41*dydt + B42*buffer2 + B43*buffer3)
    CALL odefun(n,t+A4*dt,ytmp,buffer4)

    ytmp = yin + dt*(B51*dydt + B52*buffer2 + B53*buffer3 + B54*buffer4)
    CALL odefun(n,t+A5*dt,ytmp,buffer5)

    ytmp = yin + dt*(B61*dydt + B62*buffer2 + B63*buffer3 + B64*buffer4 + B65*buffer5)
    CALL odefun(n,t+A6*dt,ytmp,buffer6)

    yout = yin + dt*(C1*dydt + C3*buffer3 + C4*buffer4 + C6*buffer6)
    yerr = dt*(DC1*dydt + DC3*buffer3 + DC4*buffer4 + DC5*buffer5 + DC6*buffer6)

  END SUBROUTINE timeStep45
jedbrown commented 10 months ago

A clean implementation means that there is no chain of provenance by which the "clean" code could be considered a derivative work. When one intends to be careful, the clean implementation is written by someone who has never seen the IP-encumbered implementation. No amount of refactoring tainted code breaks that provenance chain, and given the proximity to the events in this thread, even if you were to start over with a blank file, there would be a reasonable claim that your new implementation is still tainted. Maybe you can find a colleague or student and ask them to implement the Cash-Karp method in Fortran, or use an existing library.

Numerical Recipes unfortunately lulls scientists into licensing crises, but they clearly aren't going to change their license so it's on authors to be diligent about clean implementation procedure.

sbarbot commented 10 months ago

I will implement a new code myself using a tableau as an input. Hopefully, this will be satisfying. This may take a few days.

sbarbot commented 10 months ago

I implemented an entirely new version of the time stepping using the Butcher tableau https://en.wikipedia.org/wiki/List_of_Runge%E2%80%93Kutta_methods#Cash-Karp in share/src/rk.f90 and 3d/src/rk_mpi.f90. There should be no doubt now that the implementation is different. Thank you for suggesting this.

The solution is now more general, and I updated all the binary files accordingly. The code is still building in parallel with make, cmake, and ninja and the bitbucket pipelines work. We should be ready to go.

jedbrown commented 10 months ago

Thanks, this all looks good to me now. At this point could you:

I can then move forward with recommending acceptance of the submission.

sbarbot commented 10 months ago

Excellent news. The version tag is v1.0. The archive is at https://zenodo.org/doi/10.5281/zenodo.10129331. The doi is 10.5281/zenodo.10129331.

jedbrown commented 10 months ago

@editorialbot check references

jedbrown commented 10 months ago

@editorialbot set v1.0 as version

editorialbot commented 10 months ago

Done! version is now v1.0

editorialbot commented 10 months ago
Reference check summary (note 'MISSING' DOIs are suggestions that need verification):

OK DOIs

- 10.1785/0120210004 is OK
- 10.1016/j.tecto.2019.05.004 is OK
- 10.1029/2021JB023519 is OK
- 10.1016/j.epsl.2021.117037 is OK
- 10.1016/j.epsl.2022.117593 is OK
- 10.1029/2008JB005934 is OK
- 10.1785/0120210178 is OK
- 10.1002/2016JB012857 is OK
- 10.1002/2016JB013778 is OK
- 10.1016/j.tecto.2019.228171 is OK
- 10.1029/2007JB004930 is OK
- 10.1115/1.4005896 is OK
- 10.1029/2020JB020865 is OK
- 10.1029/2021JB023726 is OK
- 10.1186/s40623-021-01465-6 is OK
- 10.1186/s40623-022-01649-8 is OK
- 10.1186/s40623-019-1113-8 is OK
- 10.1126/science.1218796 is OK
- 10.1029/2019JB018557 is OK
- 10.1109/JPROC.2004.840301 is OK
- 10.1029/2019GC008515 is OK
- 10.1109/38.56302 is OK
- 10.1063/1.4823180 is OK
- 10.1007/978-3-540-30218-6_19 is OK
- 10.1029/2022JB025106 is OK
- 10.1029/2023AV000972 is OK
- 10.1016/j.epsl.2022.117983 is OK
- 10.1016/j.epsl.2023.118274 is OK

MISSING DOIs

- 10.1109/mcc.1998.736436 may be a valid DOI for title: Numerical recipes in Fortran 90 the art of parallel scientific computing

INVALID DOIs

- None
jedbrown commented 10 months ago

@editorialbot set 10.5281/zenodo.10129331 as archive

editorialbot commented 10 months ago

Done! archive is now 10.5281/zenodo.10129331

jedbrown commented 10 months ago

@editorialbot generate pdf

editorialbot commented 10 months ago

:point_right::page_facing_up: Download article proof :page_facing_up: View article proof on GitHub :page_facing_up: :point_left:

jedbrown commented 10 months ago

@editorialbot recommend-accept

:wave: The "missing DOI" above is a book review, not the book itself.

editorialbot commented 10 months ago
Attempting dry run of processing paper acceptance...
editorialbot commented 10 months ago
Reference check summary (note 'MISSING' DOIs are suggestions that need verification):

OK DOIs

- 10.1785/0120210004 is OK
- 10.1016/j.tecto.2019.05.004 is OK
- 10.1029/2021JB023519 is OK
- 10.1016/j.epsl.2021.117037 is OK
- 10.1016/j.epsl.2022.117593 is OK
- 10.1029/2008JB005934 is OK
- 10.1785/0120210178 is OK
- 10.1002/2016JB012857 is OK
- 10.1002/2016JB013778 is OK
- 10.1016/j.tecto.2019.228171 is OK
- 10.1029/2007JB004930 is OK
- 10.1115/1.4005896 is OK
- 10.1029/2020JB020865 is OK
- 10.1029/2021JB023726 is OK
- 10.1186/s40623-021-01465-6 is OK
- 10.1186/s40623-022-01649-8 is OK
- 10.1186/s40623-019-1113-8 is OK
- 10.1126/science.1218796 is OK
- 10.1029/2019JB018557 is OK
- 10.1109/JPROC.2004.840301 is OK
- 10.1029/2019GC008515 is OK
- 10.1109/38.56302 is OK
- 10.1063/1.4823180 is OK
- 10.1007/978-3-540-30218-6_19 is OK
- 10.1029/2022JB025106 is OK
- 10.1029/2023AV000972 is OK
- 10.1016/j.epsl.2022.117983 is OK
- 10.1016/j.epsl.2023.118274 is OK

MISSING DOIs

- 10.1109/mcc.1998.736436 may be a valid DOI for title: Numerical recipes in Fortran 90 the art of parallel scientific computing

INVALID DOIs

- None
editorialbot commented 10 months ago

:wave: @openjournals/ese-eics, this paper is ready to be accepted and published.

Check final proof :point_right::page_facing_up: Download article

If the paper PDF and the deposit XML files look good in https://github.com/openjournals/joss-papers/pull/4781, then you can now move forward with accepting the submission by compiling again with the command @editorialbot accept

sbarbot commented 10 months ago

Is there actions needed from me? I checked the final proof and it looks good.


From: The Open Journals editorial robot @.> Sent: Wednesday, November 15, 2023 11:28:49 AM To: openjournals/joss-reviews @.> Cc: Sylvain Barbot @.>; Mention @.> Subject: Re: [openjournals/joss-reviews] [REVIEW]: Motorcycle: A spectral boundary-integral method for seismic cycles on multiple faults (Issue #5097)

πŸ‘‹ @openjournals/ese-eicshttps://urldefense.com/v3/__https://github.com/orgs/openjournals/teams/ese-eics__;!!LIr3w8kk_Xxm!roQlpCZKS68KPRU_Ou0z13RkCt1lVj0YEeYX5OxHuGMdH-rNNvmOqepEzwduNpd78ecB04ILxKVxnOSl-Nu2Enk$, this paper is ready to be accepted and published.

Check final proof πŸ‘‰πŸ“„ Download articlehttps://urldefense.com/v3/__https://raw.githubusercontent.com/openjournals/joss-papers/joss.05097/joss.05097/10.21105.joss.05097.pdf__;!!LIr3w8kk_Xxm!roQlpCZKS68KPRU_Ou0z13RkCt1lVj0YEeYX5OxHuGMdH-rNNvmOqepEzwduNpd78ecB04ILxKVxnOSlUChbdQM$

If the paper PDF and the deposit XML files look good in openjournals/joss-papers#4781https://urldefense.com/v3/__https://github.com/openjournals/joss-papers/pull/4781__;!!LIr3w8kk_Xxm!roQlpCZKS68KPRU_Ou0z13RkCt1lVj0YEeYX5OxHuGMdH-rNNvmOqepEzwduNpd78ecB04ILxKVxnOSlRKY1cSE$, then you can now move forward with accepting the submission by compiling again with the command @editorialbot accept

β€” Reply to this email directly, view it on GitHubhttps://urldefense.com/v3/__https://github.com/openjournals/joss-reviews/issues/5097*issuecomment-1813131899__;Iw!!LIr3w8kk_Xxm!roQlpCZKS68KPRU_Ou0z13RkCt1lVj0YEeYX5OxHuGMdH-rNNvmOqepEzwduNpd78ecB04ILxKVxnOSlqqMqFJ0$, or unsubscribehttps://urldefense.com/v3/__https://github.com/notifications/unsubscribe-auth/ABJHTWASOHHCNMSFBOEUJWDYEUJXDAVCNFSM6AAAAAAUEMZM7GVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQMJTGEZTCOBZHE__;!!LIr3w8kk_Xxm!roQlpCZKS68KPRU_Ou0z13RkCt1lVj0YEeYX5OxHuGMdH-rNNvmOqepEzwduNpd78ecB04ILxKVxnOSltnBc5NY$. You are receiving this because you were mentioned.Message ID: @.***>

jedbrown commented 10 months ago

Not at this time, @sbarbot. We'll give the AEiC a few days to make it here.

kthyng commented 10 months ago

Hi! Ok I have a few steps to wrap up the submission:

kthyng commented 10 months ago

Everything looks great! Good to go.

kthyng commented 10 months ago

@editorialbot accept

editorialbot commented 10 months ago
Doing it live! Attempting automated processing of paper acceptance...
editorialbot commented 10 months ago

Ensure proper citation by uploading a plain text CITATION.cff file to the default branch of your repository.

If using GitHub, a Cite this repository menu will appear in the About section, containing both APA and BibTeX formats. When exported to Zotero using a browser plugin, Zotero will automatically create an entry using the information contained in the .cff file.

You can copy the contents for your CITATION.cff file here:

CITATION.cff

``` cff-version: "1.2.0" authors: - family-names: Barbot given-names: Sylvain orcid: "https://orcid.org/0000-0003-4257-7409" doi: 10.5281/zenodo.10129331 message: If you use this software, please cite our article in the Journal of Open Source Software. preferred-citation: authors: - family-names: Barbot given-names: Sylvain orcid: "https://orcid.org/0000-0003-4257-7409" date-published: 2023-11-16 doi: 10.21105/joss.05097 issn: 2475-9066 issue: 91 journal: Journal of Open Source Software publisher: name: Open Journals start: 5097 title: "Motorcycle: A spectral boundary-integral method for seismic cycles on multiple faults" type: article url: "https://joss.theoj.org/papers/10.21105/joss.05097" volume: 8 title: "Motorcycle: A spectral boundary-integral method for seismic cycles on multiple faults" ```

If the repository is not hosted on GitHub, a .cff file can still be uploaded to set your preferred citation. Users will be able to manually copy and paste the citation.

Find more information on .cff files here and here.

editorialbot commented 10 months ago

🐘🐘🐘 πŸ‘‰ Toot for this paper πŸ‘ˆ 🐘🐘🐘

editorialbot commented 10 months ago

🚨🚨🚨 THIS IS NOT A DRILL, YOU HAVE JUST ACCEPTED A PAPER INTO JOSS! 🚨🚨🚨

Here's what you must now do:

  1. Check final PDF and Crossref metadata that was deposited :point_right: https://github.com/openjournals/joss-papers/pull/4785
  2. Wait five minutes, then verify that the paper DOI resolves https://doi.org/10.21105/joss.05097
  3. If everything looks good, then close this review issue.
  4. Party like you just published a paper! πŸŽ‰πŸŒˆπŸ¦„πŸ’ƒπŸ‘»πŸ€˜

Any issues? Notify your editorial technical team...

sbarbot commented 10 months ago

If one of you is already on Mastodon (https://fosstodon.org/https://fosstodon.org/explore), could you invite me to join? The site takes new members upon invitation only. Thanks.


From: The Open Journals editorial robot @.> Sent: Thursday, November 16, 2023 9:02:47 AM To: openjournals/joss-reviews @.> Cc: Sylvain Barbot @.>; Mention @.> Subject: Re: [openjournals/joss-reviews] [REVIEW]: Motorcycle: A spectral boundary-integral method for seismic cycles on multiple faults (Issue #5097)

Ensure proper citation by uploading a plain text CITATION.cff file to the default branch of your repository.

If using GitHub, a Cite this repository menu will appear in the About section, containing both APA and BibTeX formats. When exported to Zotero using a browser plugin, Zotero will automatically create an entry using the information contained in the .cff file.

You can copy the contents for your CITATION.cff file here:

CITATION.cff

cff-version: "1.2.0" authors:

If the repository is not hosted on GitHub, a .cff file can still be uploaded to set your preferred citation. Users will be able to manually copy and paste the citation.

Find more information on .cff files herehttps://urldefense.com/v3/__https://github.com/citation-file-format/citation-file-format/blob/main/README.md__;!!LIr3w8kk_Xxm!sK8dPIF0_-HCmP9VMRm9AutqSNF13wtFbo3qK-V5jiQLJUovYhMdYSfqDLLsvGofrYwKpNUU07MhXX9dYG9sZBw$ and herehttps://urldefense.com/v3/__https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-citation-files__;!!LIr3w8kk_Xxm!sK8dPIF0_-HCmP9VMRm9AutqSNF13wtFbo3qK-V5jiQLJUovYhMdYSfqDLLsvGofrYwKpNUU07MhXX9dYic3oVw$.

β€” Reply to this email directly, view it on GitHubhttps://urldefense.com/v3/__https://github.com/openjournals/joss-reviews/issues/5097*issuecomment-1814860338__;Iw!!LIr3w8kk_Xxm!sK8dPIF0_-HCmP9VMRm9AutqSNF13wtFbo3qK-V5jiQLJUovYhMdYSfqDLLsvGofrYwKpNUU07MhXX9dG-OnSVk$, or unsubscribehttps://urldefense.com/v3/__https://github.com/notifications/unsubscribe-auth/ABJHTWFU6LUAFE64BQY2XXDYEZBLPAVCNFSM6AAAAAAUEMZM7GVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQMJUHA3DAMZTHA__;!!LIr3w8kk_Xxm!sK8dPIF0_-HCmP9VMRm9AutqSNF13wtFbo3qK-V5jiQLJUovYhMdYSfqDLLsvGofrYwKpNUU07MhXX9d0lByhN0$. You are receiving this because you were mentioned.Message ID: @.***>

kthyng commented 10 months ago

Congrats on your new publication @sbarbot! Many thanks to editor @jedbrown and reviewers @mherman09, @willic3, and @thehalfspace for your time, hard work, and expertise!!

kthyng commented 10 months ago

@sbarbot I am not on mastodon and have rather neglected Twitter, sorry!