Closed editorialbot closed 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).
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.
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).
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.
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
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.
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.
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")
Amazing. I propagated the same hack to the other CMakeLists.txt
files. All is working now.
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
@editorialbot generate pdf
:point_right::page_facing_up: Download article proof :page_facing_up: View article proof on GitHub :page_facing_up: :point_left:
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
What is the best course of action to deal with the numerical recipe code?
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.
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.
@editorialbot generate pdf
:point_right::page_facing_up: Download article proof :page_facing_up: View article proof on GitHub :page_facing_up: :point_left:
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.
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.
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?
!------------------------------------------------------------------------------
! 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
!------------------------------------------------------------------------------
!> 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
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.
I will implement a new code myself using a tableau as an input. Hopefully, this will be satisfying. This may take a few days.
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.
Thanks, this all looks good to me now. At this point could you:
I can then move forward with recommending acceptance of the submission.
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.
@editorialbot check references
@editorialbot set v1.0 as version
Done! version is now v1.0
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 set 10.5281/zenodo.10129331 as archive
Done! archive is now 10.5281/zenodo.10129331
@editorialbot generate pdf
:point_right::page_facing_up: Download article proof :page_facing_up: View article proof on GitHub :page_facing_up: :point_left:
@editorialbot recommend-accept
:wave: The "missing DOI" above is a book review, not the book itself.
Attempting dry run of processing paper acceptance...
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
: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
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: @.***>
Not at this time, @sbarbot. We'll give the AEiC a few days to make it here.
Hi! Ok I have a few steps to wrap up the submission:
Everything looks great! Good to go.
@editorialbot accept
Doing it live! Attempting automated processing of paper acceptance...
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:
``` 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.
πππ π Toot for this paper π πππ
π¨π¨π¨ THIS IS NOT A DRILL, YOU HAVE JUST ACCEPTED A PAPER INTO JOSS! π¨π¨π¨
Here's what you must now do:
Any issues? Notify your editorial technical team...
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: @.***>
Congrats on your new publication @sbarbot! Many thanks to editor @jedbrown and reviewers @mherman09, @willic3, and @thehalfspace for your time, hard work, and expertise!!
@sbarbot I am not on mastodon and have rather neglected Twitter, sorry!
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 badge code:
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:
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