From e1183cc478ebfeaf8717b439c25f6b400c08d727 Mon Sep 17 00:00:00 2001 From: ErolBa Date: Thu, 12 Dec 2024 19:26:56 +0100 Subject: [PATCH 1/6] added updates --- src/dforce.f90 | 89 +++++++++++++++++++++++++++++++++++++++++++++++--- src/dfp100.f90 | 15 ++++++++- src/global.f90 | 5 ++- src/hesian.f90 | 54 +++++++++++++++++------------- src/newton.f90 | 2 +- src/preset.f90 | 15 +++++++-- src/sphdf5.f90 | 50 ++++++++++++++++++++++++++-- src/volume.f90 | 5 ++- 8 files changed, 200 insertions(+), 35 deletions(-) diff --git a/src/dforce.f90 b/src/dforce.f90 index 05f59b2c..746513cb 100644 --- a/src/dforce.f90 +++ b/src/dforce.f90 @@ -98,14 +98,14 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) use numerical, only : logtolerance - use fileunits, only : ounit + use fileunits, only : ounit, munit use inputlist, only : Wmacros, Wdforce, Nvol, Ntor, Lrad, Igeometry, & epsilon, & Lconstraint, Lcheck, dRZ, & Lextrap, & mupftol, & - Lfreebound, LHmatrix + Lfreebound, LHmatrix, gamma, pscale, adiabatic use cputiming, only : Tdforce @@ -134,7 +134,8 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) LocalConstraint, xoffset, & solution, IPdtdPf, & IsMyVolume, IsMyVolumeValue, WhichCpuID, & - ext ! For outputing Lcheck = 6 test + ext, & ! For outputing Lcheck = 6 test + BetaTotal, vvolume !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -164,6 +165,9 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) LOGICAL :: LComputeAxis, dfp100_logical + REAL :: press, voltotal + REAL :: betavol(1:Mvol) + #ifdef DEBUG INTEGER :: isymdiff REAL :: dvol(-1:+1), evolume, imupf(1:2,-2:2), lfactor @@ -239,8 +243,13 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) ! Mvol-1 surface current plus 1 poloidal linking current constraints Ndofgl = Mvol else - ! Mvol-1 surface current constraints - Ndofgl = Mvol-1 + ! add an additional constraint to make the total pflux = 0 + if(Igeometry.eq.1) then + Ndofgl = Mvol + else + ! Mvol-1 surface current constraints + Ndofgl = Mvol-1 + endif endif SALLOCATE( Fvec, (1:Ndofgl), zero ) @@ -257,6 +266,11 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) ! one step Newton's method dpflux(2:Mvol) = dpflux(2:Mvol) - dpfluxout(1:Mvol-1) + + if(Igeometry.eq.1) then + dpflux(1) = dpflux(1) - dpfluxout(Mvol) + endif + if( Lfreebound.eq.1 ) then dtflux(Mvol) = dtflux(Mvol ) - dpfluxout(Mvol ) endif @@ -305,6 +319,38 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) enddo ! end of do vvol = 1, Mvol + !add an additional constraint to make the total pflux 0 + if(Igeometry.eq.1) then + + vvol = 1 + + WCALL(dforce, IsMyVolume, (vvol)) + + if( IsMyVolumeValue .EQ. 0 ) then + + else if( IsMyVolumeValue .EQ. -1) then + FATAL(dforce, .true., Unassociated volume) + else + NN = NAdof(vvol) + + SALLOCATE( solution, (1:NN, 0:2), zero) + + ! Pack field and its derivatives + packorunpack = 'P' + WCALL( dforce, packab, ( packorunpack, vvol, NN, solution(1:NN,0), 0 ) ) ! packing; + WCALL( dforce, packab, ( packorunpack, vvol, NN, solution(1:NN,2), 2 ) ) ! packing; + + ! compute the field with renewed dpflux via single Newton method step + solution(1:NN, 0) = solution(1:NN, 0) - dpfluxout(Mvol) * solution(1:NN, 2) + + ! Unpack field in vector potential Fourier harmonics + packorunpack = 'U' + WCALL( dforce, packab, ( packorunpack, vvol, NN, solution(1:NN,0), 0 ) ) ! unpacking; + + DALLOCATE( solution ) + endif + endif + DALLOCATE(Fvec) DALLOCATE(dpfluxout) @@ -393,6 +439,28 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) lBBintegral(1:Nvol) = lBBintegral(1:Nvol) * half + voltotal = 0.0 + + do vvol = 1, Mvol + WCALL(dforce, IsMyVolume, (vvol)) + if( IsMyVolumeValue .EQ. 0 ) then + cycle + else if( IsMyVolumeValue .EQ. -1) then + FATAL(dforce, .true., Unassociated volume) + endif + + vvolume(vvol) = vvolume(vvol) + + press = adiabatic(vvol) * pscale / vvolume(vvol)**gamma + + betavol(vvol) = press * vvolume(vvol) / lBBintegral(vvol) + betavol(vvol) = betavol(vvol) * vvolume(vvol) + voltotal = voltotal+vvolume(vvol) + !write(*,*) "Calc beta: ", betavol(vvol), vvolume(vvol) + enddo + + BetaTotal = sum(betavol(1:Nvol))/voltotal ! Calculate total beta which is obtained from individual betas + Energy = sum( lBBintegral(1:Nvol) ) ! should also compute beta; !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -902,6 +970,17 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! +if(Lhessianallocated .and. Igeometry.eq.1) then + if( myid.eq.0 ) then ; cput = GETTIME ; write(ounit,'("hesian : ",f10.2," : LHmatrix="L2" ;")')cput-cpus, LHmatrix ; + write(*,*) "Writing .hessian file..." + open(munit, file=trim(ext)//".sp.hessian", status="unknown", form="unformatted") + write(munit) NGdof + write(munit) hessian(1:NGdof,1:NGdof) + close(munit) + + endif + endif + RETURN(dforce) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/dfp100.f90 b/src/dfp100.f90 index acb75e37..dd724ada 100644 --- a/src/dfp100.f90 +++ b/src/dfp100.f90 @@ -63,7 +63,7 @@ subroutine dfp100(Ndofgl, x, Fvec, LComputeDerivatives) DDtzcc, DDtzcs, DDtzsc, DDtzss, & DDzzcc, DDzzcs, DDzzsc, DDzzss, & dMA, dMB, dMD, dMG, MBpsi, solution, & - Nt, Nz, LILUprecond, Lsavedguvij, NOTMatrixFree, guvijsave, izbs + Nt, Nz, LILUprecond, Lsavedguvij, NOTMatrixFree, guvijsave, izbs, total_pflux LOCALS !------ @@ -205,6 +205,19 @@ subroutine dfp100(Ndofgl, x, Fvec, LComputeDerivatives) Fvec(1:Mvol-1) = IPDt(1:Mvol-1) - Isurf(1:Mvol-1) endif + ! Set the total pflux to 0 + if(Igeometry.eq.1) then + + IPDtDpf(1,Mvol) = -pi2 * Bt00(1,1,2) + IPdtdPf(2:Mvol,Mvol) = 0.0 + IPDtDpf(Mvol,1:Mvol) = 1.0 + + ! Constraint the total pflux (pflux(Mvol)) + ! zero for symmetric initial profiles + ! non-zero for asymmetric profiles + Fvec(Mvol) = sum(dpflux(1:Mvol)) - total_pflux + endif + ! Compute poloidal linking current constraint as well in case of free boundary computation if ( Lfreebound.eq.1 ) then diff --git a/src/global.f90 b/src/global.f90 index eef1a344..902cd112 100644 --- a/src/global.f90 +++ b/src/global.f90 @@ -251,11 +251,14 @@ module allglobal REAL :: ForceErr !< total force-imbalance REAL :: Energy !< MHD energy REAL :: BnsErr !< (in freeboundary) error in self-consistency of field on plasma boundary (Picard iteration) + REAL :: BetaTotal = 0.0 !< Beta, averaged over entire domain REAL , allocatable :: IPDt(:), IPDtDpf(:,:) !< Toroidal pressure-driven current INTEGER :: Mvol !< total number of volumes (including the vacuum region in the case of free-boundary calculations) + REAL :: total_pflux ! used when Lconstraint=3, Igeometry=1 + LOGICAL :: YESstellsym !< internal shorthand copies of Istellsym, which is an integer input; LOGICAL :: NOTstellsym !< internal shorthand copies of Istellsym, which is an integer input; @@ -1678,7 +1681,7 @@ subroutine wrtend write(iunit,'(" adiabatic = ",257es23.15)') adiabatic(1:Mvol) write(iunit,'(" mu = ",257es23.15)') mu(1:Mvol) write(iunit,'(" Ivolume = ",257es23.15)') Ivolume(1:Mvol) - write(iunit,'(" Isurf = ",257es23.15)') Isurf(1:Mvol-1), 0.0 + write(iunit,'(" Isurf = ",257es23.15)') IPDt(1:Mvol) ! Prints the actual surf current, not the targeted one write(iunit,'(" Lconstraint = ",i9 )') Lconstraint write(iunit,'(" pl = ",257i23 )') pl(0:Mvol) write(iunit,'(" ql = ",257i23 )') ql(0:Mvol) diff --git a/src/hesian.f90 b/src/hesian.f90 index 24b367f0..1f0fa9ea 100644 --- a/src/hesian.f90 +++ b/src/hesian.f90 @@ -22,7 +22,7 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) use inputlist, only : Wmacros, Whesian, Igeometry, Nvol, pflux, helicity, mu, Lfreebound, & LHevalues, LHevectors, LHmatrix, & Lperturbed, dpp, dqq, & - Lcheck, Lfindzero + Lcheck, Lfindzero, Lconstraint use cputiming, only : Thesian @@ -37,6 +37,8 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) Lhessian3Dallocated,denergydrr, denergydrz,denergydzr,denergydzz, & LocalConstraint + use sphdf5, only : write_stability + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! LOCALS @@ -90,6 +92,11 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) BEGIN(hesian) + ! Only makes sense to compute the Hessian if helicity is constrained + if(Lconstraint.ne.2) then + return + endif + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! lmu(1:Nvol) = mu(1:Nvol) ; lpflux(1:Nvol) = pflux(1:Nvol) ; lhelicity(1:Nvol) = helicity(1:Nvol) ! save original profile information; 20 Jun 14; @@ -229,7 +236,7 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) !if (LHmatrix) then Lhessian3Dallocated = .true. !else - ! Lhessianallocated = .true. + Lhessianallocated = .true. !endif !This step cleared. @@ -416,16 +423,16 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - if( LHmatrix ) then - - if( myid.eq.0 ) then ; cput = GETTIME ; write(ounit,'("hesian : ",f10.2," : LHmatrix="L2" ;")')cput-cpus, LHmatrix ; - open(munit, file=trim(get_hidden(ext))//".GF.ma", status="unknown", form="unformatted") - write(munit) NGdof - write(munit) ohessian(1:NGdof,1:NGdof) - close(munit) - endif - - endif +! if( LHmatrix ) then +! +! if( myid.eq.0 ) then ; cput = GETTIME ; write(ounit,'("hesian : ",f10.2," : LHmatrix="L2" ;")')cput-cpus, LHmatrix ; +! open(munit, file=trim(get_hidden(ext))//".GF.ma", status="unknown", form="unformatted") +! write(munit) NGdof +! write(munit) ohessian(1:NGdof,1:NGdof) +! close(munit) +! endif +! +! endif ! if( myid.eq.0 .and. ( LHevalues .or. LHevectors ) ) then ! the call to dforce below requires all cpus; 04 Dec 14; @@ -572,19 +579,22 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - - if( myid.eq.0 ) then ! write to file; 04 Dec 14; - open(hunit, file=trim(get_hidden(ext))//".GF.ev", status="unknown", form="unformatted") - write(hunit) NGdof, Ldvr, Ldvi - write(hunit) evalr - write(hunit) evali - write(hunit) evecr - write(hunit) eveci - close(hunit) - endif ! end of if( myid.eq.0 ) ; 04 Dec 14; +! if( myid.eq.0 ) then ! write to file; 04 Dec 14; +! open(hunit, file=trim(get_hidden(ext))//".GF.ev", status="unknown", form="unformatted") +! write(hunit) NGdof, Ldvr, Ldvi +! write(hunit) evalr +! write(hunit) evali +! write(hunit) evecr +! write(hunit) eveci +! close(hunit) +! endif ! end of if( myid.eq.0 ) ; 04 Dec 14; endif ! end of if( ( LHevalues .or. LHevectors ) ) + ! output hessian, eigenvalues, and eigenvectors to the .h5 file + if( LHmatrix .and. Lconstraint.eq.2) then + WCALL( hesian, write_stability, (ohessian, evalr, evali, evecr, NGdof) ) + endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! if( myid.eq.0 .and. Lperturbed.eq.1 ) then diff --git a/src/newton.f90 b/src/newton.f90 index 034b4210..cd79da3b 100644 --- a/src/newton.f90 +++ b/src/newton.f90 @@ -97,7 +97,7 @@ subroutine newton( NGdof, position, ihybrd ) INTEGER :: ML, MU ! required for only Lc05ndf; - LOGICAL :: Lexit = .true. ! perhaps this could be made user input; + LOGICAL :: Lexit = .false. ! if false, hessian is printed even with initial force balance LOGICAL :: LComputeAxis INTEGER :: nprint = 1, nfev, njev diff --git a/src/preset.f90 b/src/preset.f90 index b29c5d8d..e3a6102a 100644 --- a/src/preset.f90 +++ b/src/preset.f90 @@ -507,9 +507,15 @@ subroutine preset SALLOCATE( dtflux, (1:Mvol), zero ) SALLOCATE( dpflux, (1:Mvol), zero ) + + ! with Igeom=1, Lcons=3, need to provide total pflux + if(Lconstraint.eq.3 .and. Igeometry.eq.1) then + total_pflux = pflux(Mvol) * phiedge / pi2 + pflux(Mvol) = 0 + endif select case( Igeometry ) - case( 1 ) ; dtflux(1) = tflux(1) ; dpflux(1) = pflux(1) ! Cartesian ; this is the "inverse" operation defined in xspech; 09 Mar 17; + case( 1 ) ; dtflux(1) = tflux(1) ; dpflux(1) = pflux(1) ! Cartesian ; this is the "inverse" operation defined in xspech; 09 Mar 17; case( 2:3 ) ; dtflux(1) = tflux(1) ; dpflux(1) = zero ! cylindrical or toroidal; end select @@ -807,7 +813,12 @@ subroutine preset if( Lfreebound.eq.1 ) then SALLOCATE( IPDtDpf, (1:Mvol , 1:Mvol ), zero) else - SALLOCATE( IPDtDpf, (1:Mvol-1, 1:Mvol-1), zero) + if(Igeometry.eq.1) then + ! add an additional constraint to make the total pflux = 0 + SALLOCATE( IPDtDpf, (1:Mvol, 1:Mvol), zero) + else + SALLOCATE( IPDtDpf, (1:Mvol-1, 1:Mvol-1), zero) + endif endif SALLOCATE( cheby, (0:Mrad,0:2), zero ) diff --git a/src/sphdf5.f90 b/src/sphdf5.f90 index 455fdcdc..f6c833bf 100644 --- a/src/sphdf5.f90 +++ b/src/sphdf5.f90 @@ -45,6 +45,7 @@ module sphdf5 integer(hid_t) :: dt_nDcalls_id !< Memory datatype identifier (for "nDcalls" dataset in "/iterations") integer(hid_t) :: dt_Energy_id !< Memory datatype identifier (for "Energy" dataset in "/iterations") integer(hid_t) :: dt_ForceErr_id !< Memory datatype identifier (for "ForceErr" dataset in "/iterations") + integer(hid_t) :: dt_BetaTotal_id !< Memory datatype identifier (for "ForceErr" dataset in "/iterations") integer(hid_t) :: dt_iRbc_id !< Memory datatype identifier (for "iRbc" dataset in "/iterations") integer(hid_t) :: dt_iZbs_id !< Memory datatype identifier (for "iZbs" dataset in "/iterations") integer(hid_t) :: dt_iRbs_id !< Memory datatype identifier (for "iRbs" dataset in "/iterations") @@ -480,6 +481,7 @@ subroutine init_convergence_output H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, type_size_i, dt_nDcalls_id, hdfier) ) H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, type_size_d, dt_Energy_id, hdfier) ) H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, type_size_d, dt_ForceErr_id, hdfier) ) + H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, type_size_d, dt_BetaTotal_id, hdfier) ) H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, irbc_size, dt_iRbc_id, hdfier) ) H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, irbc_size, dt_iZbs_id, hdfier) ) H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, irbc_size, dt_iRbs_id, hdfier) ) @@ -488,6 +490,7 @@ subroutine init_convergence_output H5CALL( sphdf5, h5tinsert_f, (dt_nDcalls_id, "nDcalls", offset, H5T_NATIVE_INTEGER, hdfier) ) H5CALL( sphdf5, h5tinsert_f, (dt_Energy_id, "Energy", offset, H5T_NATIVE_DOUBLE, hdfier) ) H5CALL( sphdf5, h5tinsert_f, (dt_ForceErr_id, "ForceErr", offset, H5T_NATIVE_DOUBLE, hdfier) ) + H5CALL( sphdf5, h5tinsert_f, (dt_BetaTotal_id, "BetaTotal", offset, H5T_NATIVE_DOUBLE, hdfier) ) H5CALL( sphdf5, h5tinsert_f, (dt_iRbc_id, "iRbc", offset, iRZbscArray_id, hdfier) ) H5CALL( sphdf5, h5tinsert_f, (dt_iZbs_id, "iZbs", offset, iRZbscArray_id, hdfier) ) H5CALL( sphdf5, h5tinsert_f, (dt_iRbs_id, "iRbs", offset, iRZbscArray_id, hdfier) ) @@ -513,7 +516,7 @@ end subroutine init_convergence_output !> @param[in] ForceErr total force-imbalance (accessible from allglobal) subroutine write_convergence_output( nDcalls, ForceErr ) - use allglobal, only : myid, mn, Mvol, Energy, iRbc, iZbs, iRbs, iZbc + use allglobal, only : myid, mn, Mvol, Energy, iRbc, iZbs, iRbs, iZbc, BetaTotal LOCALS INTEGER, intent(in) :: nDcalls @@ -546,6 +549,8 @@ subroutine write_convergence_output( nDcalls, ForceErr ) H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_Energy_id, Energy, INT((/1/), HSIZE_T), hdfier, & & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_ForceErr_id, ForceErr, INT((/1/), HSIZE_T), hdfier, & + & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) + H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_BetaTotal_id, BetaTotal, INT((/1/), HSIZE_T), hdfier, & & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_iRbc_id, iRbc, INT((/mn,Mvol+1/), HSIZE_T), hdfier, & & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) @@ -979,12 +984,50 @@ end subroutine write_vector_potential !> \brief Write the final state of the equilibrium to the output file. !> \ingroup grp_output !> + +subroutine write_stability(ohessian, evalr, evali, evecr, NGdof) + + use inputlist, only : LHevalues, LHevectors, LHmatrix + + LOCALS + integer, intent(in) :: NGdof + REAL, intent(in) :: ohessian(:,:), evalr(:), evali(:), evecr(:,:) + integer(hid_t) :: grpStability + + BEGIN( sphdf5 ) + + if (.not.LHevalues .and. .not.LHevectors .and. .not.LHmatrix) return + + if (myid.eq.0 .and. .not.skip_write) then + + HDEFGRP( file_id, stability, grpStability) + + if (LHmatrix) then + HWRITERA( grpStability, NGdof, NGdof, ohessian, ohessian(1:NGdof,1:NGdof) ) + endif + + if (LHevectors) then + HWRITERA( grpStability, NGdof, NGdof, evecr, evecr(1:NGdof,1:NGdof) ) + endif + + if (LHevalues) then + HWRITERV( grpStability, NGdof, evalr, evalr(1:NGdof) ) + HWRITERV( grpStability, NGdof, evali, evali(1:NGdof) ) + endif + + HCLOSEGRP( grpStability ) + + endif ! myid.eq.0 + +end subroutine write_stability + + subroutine hdfint use fileunits, only : ounit use inputlist use allglobal, only : ncpu, cpus, & - Mvol, ForceErr, BnsErr,& + Mvol, ForceErr, BnsErr, BetaTotal, & mn, im, in, iRbc, iZbs, iRbs, iZbc, & mns, ims, ins, & dRbc, dZbs, dRbs, dZbc, & @@ -1048,6 +1091,8 @@ subroutine hdfint HWRITERV( grpOutput, 1, BnsErr, (/ BnsErr /)) ! already in /input/global !latex \type{ForceErr} & real & \pb{force-balance error across interfaces} \\ HWRITERV( grpOutput, 1, ForceErr, (/ ForceErr /)) + !latex \type{BetaTotal} & real & \pb{Total plasma beta} \\ + HWRITERV( grpOutput, 1, BetaTotal, (/ BetaTotal /)) !latex \type{Ivolume} & real & \pb{Volume current at output (parallel, externally induced)} HWRITERV( grpOutput, Mvol, Ivolume, Ivolume(1:Mvol)) !latex \type{IPDt} & real & \pb{Surface current at output} @@ -1152,6 +1197,7 @@ subroutine finish_outfile H5CALL( sphdf5, h5tclose_f, (dt_nDcalls_id, hdfier) , __FILE__, __LINE__) H5CALL( sphdf5, h5tclose_f, (dt_Energy_id, hdfier) , __FILE__, __LINE__) H5CALL( sphdf5, h5tclose_f, (dt_ForceErr_id, hdfier) , __FILE__, __LINE__) + H5CALL( sphdf5, h5tclose_f, (dt_BetaTotal_id, hdfier) , __FILE__, __LINE__) H5CALL( sphdf5, h5tclose_f, (dt_iRbc_id, hdfier) , __FILE__, __LINE__) H5CALL( sphdf5, h5tclose_f, (dt_iZbs_id, hdfier) , __FILE__, __LINE__) H5CALL( sphdf5, h5tclose_f, (dt_iRbs_id, hdfier) , __FILE__, __LINE__) diff --git a/src/volume.f90 b/src/volume.f90 index 9cca6819..f7ce6a62 100644 --- a/src/volume.f90 +++ b/src/volume.f90 @@ -44,7 +44,7 @@ subroutine volume( lvol, vflag ) use fileunits, only : ounit - use inputlist, only : Wvolume, Igeometry, Nvol, pscale + use inputlist, only : Wvolume, Igeometry, Nvol, pscale, rpol, rtor use cputiming @@ -125,6 +125,9 @@ subroutine volume( lvol, vflag ) if( dBdX%issym.eq.0 ) dvolume = one ! note that the sign factor for the lower interface is included below; 20 Jun 14; endif + ! respecting rpol, rtor sizes of slab + vol(innout) = vol(innout) * rpol * rtor + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! case( 2 ) !>
  • \c Igeometry.eq.2 : cylindrical : \f$\sqrt g = R R_s = \frac{1}{2}\partial_s (R^2)\f$ From 5615d7d9fc2683c4722594395abb9b604173a2cc Mon Sep 17 00:00:00 2001 From: ErolBa Date: Thu, 12 Dec 2024 19:50:49 +0100 Subject: [PATCH 2/6] added a test for G=1 Lcons=3 --- .../G1V03L0Fi.sp} | 0 ci/{G1V03L2Fi => G1V03L0Fi}/compare.h5 | Bin ci/G1V03L3Fi/G1V03L3Fi.sp | 109 ++++++++++++++++++ ci/G1V03L3Fi/compare.h5 | Bin 0 -> 464736 bytes 4 files changed, 109 insertions(+) rename ci/{G1V03L2Fi/G1V03L2Fi.001.sp => G1V03L0Fi/G1V03L0Fi.sp} (100%) rename ci/{G1V03L2Fi => G1V03L0Fi}/compare.h5 (100%) create mode 100644 ci/G1V03L3Fi/G1V03L3Fi.sp create mode 100644 ci/G1V03L3Fi/compare.h5 diff --git a/ci/G1V03L2Fi/G1V03L2Fi.001.sp b/ci/G1V03L0Fi/G1V03L0Fi.sp similarity index 100% rename from ci/G1V03L2Fi/G1V03L2Fi.001.sp rename to ci/G1V03L0Fi/G1V03L0Fi.sp diff --git a/ci/G1V03L2Fi/compare.h5 b/ci/G1V03L0Fi/compare.h5 similarity index 100% rename from ci/G1V03L2Fi/compare.h5 rename to ci/G1V03L0Fi/compare.h5 diff --git a/ci/G1V03L3Fi/G1V03L3Fi.sp b/ci/G1V03L3Fi/G1V03L3Fi.sp new file mode 100644 index 00000000..93958d56 --- /dev/null +++ b/ci/G1V03L3Fi/G1V03L3Fi.sp @@ -0,0 +1,109 @@ +&physicslist + Igeometry = 1 + Istellsym = 1 + Lfreebound = 0 + phiedge = 1.000000000000000E+00 + curtor = 0.000000000000000E+00 + curpol = 0.000000000000000E+00 + gamma = 0.000000000000000E+00 + Nfp = 1 + Nvol = 3 + Mpol = 1 + Ntor = 0 + Lrad = 12 12 12 + tflux = 4.000000000000000E-01 6.000000000000001E-01 1.000000000000000E+00 + pflux = -4.000000000000001E-02 -4.000000000000001E-02 0.000000000000000E+00 + helicity = -8.673617379884035E-19 1.331565149512061E-03 1.734723475976807E-18 + pscale = 0.000000000000000E+00 + Ladiabatic = 0 + pressure = 0.000000000000000E+00 0.000000000000000E+00 0.000000000000000E+00 + adiabatic = 0.000000000000000E+00 0.000000000000000E+00 0.000000000000000E+00 + mu = 0.000000000000000E+00 1.000000000000000E-01 0.000000000000000E+00 + Lconstraint = 3 + pl = 0 0 0 0 + ql = 0 0 0 0 + pr = 0 0 0 0 + qr = 0 0 0 0 + iota = -1.618000000000000E+00 -1.016882954640000E+00 -6.188295464000000E-01 6.188295464000000E-01 + lp = 81 81 81 81 + lq = 0 0 0 0 + rp = 0 0 0 0 + rq = 0 0 0 0 + oita = -1.618000000000000E+00 -1.016882954640000E+00 -6.188295464000000E-01 6.188295464000000E-01 + mupftol = 1.000000000000000E-16 + mupfits = 8 + Rac = 0.000000000000000E+00 + Zas = 0.000000000000000E+00 + Ras = 0.000000000000000E+00 + Zac = 0.000000000000000E+00 +Rbc(0,0) = 1.000000000000000E+01 Zbs(0,0) = 0.000000000000000E+00 Rbs(0,0) = 0.000000000000000E+00 Zbc(0,0) = 0.000000000000000E+00 +Rbc(0,1) = 0.000000000000000E+00 Zbs(0,1) = 0.000000000000000E+00 Rbs(0,1) = 0.000000000000000E+00 Zbc(0,1) = 0.000000000000000E+00 +Rbc(0,2) = 0.000000000000000E+00 Zbs(0,2) = 0.000000000000000E+00 Rbs(0,2) = 0.000000000000000E+00 Zbc(0,2) = 0.000000000000000E+00 +Rwc(0,0) = 0.000000000000000E+00 Zws(0,0) = 0.000000000000000E+00 Rws(0,0) = 0.000000000000000E+00 Zwc(0,0) = 0.000000000000000E+00 +Rwc(0,1) = 0.000000000000000E+00 Zws(0,1) = 0.000000000000000E+00 Rws(0,1) = 0.000000000000000E+00 Zwc(0,1) = 0.000000000000000E+00 +Rwc(0,2) = 0.000000000000000E+00 Zws(0,2) = 0.000000000000000E+00 Rws(0,2) = 0.000000000000000E+00 Zwc(0,2) = 0.000000000000000E+00 +Vns(0,0) = 0.000000000000000E+00 Bns(0,0) = 0.000000000000000E+00 Vnc(0,0) = 0.000000000000000E+00 Bnc(0,0) = 0.000000000000000E+00 +Vns(0,1) = 0.000000000000000E+00 Bns(0,1) = 0.000000000000000E+00 Vnc(0,1) = 0.000000000000000E+00 Bnc(0,1) = 0.000000000000000E+00 +Vns(0,2) = 0.000000000000000E+00 Bns(0,2) = 0.000000000000000E+00 Vnc(0,2) = 0.000000000000000E+00 Bnc(0,2) = 0.000000000000000E+00 +/ +&numericlist + Linitialize = 1 + Lzerovac = 0 + Ndiscrete = 2 + Nquad = -1 + iMpol = -4 + iNtor = -4 + Lsparse = 0 + Lsvdiota = 0 + imethod = 3 + iorder = 2 + iprecon = 1 + iotatol = -1.000000000000000E+00 + Lextrap = 0 + Mregular = -1 +/ +&locallist + LBeltrami = 4 + Linitgues = 1 +/ +&globallist + Lfindzero = 2 + escale = 0.000000000000000E+00 + opsilon = 1.000000000000000E+00 + pcondense = 2.000000000000000E+00 + epsilon = 0.000000000000000E+00 + wpoloidal = 1.000000000000000E+00 + upsilon = 1.000000000000000E+00 + forcetol = 1.000000000000000E-12 + c05xmax = 1.000000000000000E-06 + c05xtol = 1.000000000000000E-10 + c05factor = 1.000000000000000E-02 + LreadGF = F + mfreeits = 0 + gBntol = 1.000000000000000E-06 + gBnbld = 6.660000000000000E-01 + vcasingeps = 1.000000000000000E-12 + vcasingtol = 1.000000000000000E-08 + vcasingits = 8 + vcasingper = 1 +/ +&diagnosticslist + odetol = 1.000000000000000E-07 + nPpts = 500 + nPtrj = 5 10 5 + LHevalues = F + LHevectors = F + LHmatrix = T + Lperturbed = 0 + dpp = -1 + dqq = -1 + Lcheck = 1 + Ltiming = F +/ +&screenlist + Wpp00aa = T + Whesian = T +/ + 0 0 4.002650778313936E+00 0.000000000000000E+00 0.000000000000000E+00 0.000000000000000E+00 5.997349221686633E+00 0.000000000000000E+00 0.000000000000000E+00 0.000000000000000E+00 1.000000000000000E+01 0.000000000000000E+00 0.000000000000000E+00 0.000000000000000E+00 + 1 0 -3.027260137998658E-24 0.000000000000000E+00 0.000000000000000E+00 0.000000000000000E+00 -1.425242065616607E-28 0.000000000000000E+00 0.000000000000000E+00 0.000000000000000E+00 0.000000000000000E+00 0.000000000000000E+00 0.000000000000000E+00 0.000000000000000E+00 + 2 0 -2.762051886527595E-25 0.000000000000000E+00 0.000000000000000E+00 0.000000000000000E+00 2.843088394703559E-29 0.000000000000000E+00 0.000000000000000E+00 0.000000000000000E+00 0.000000000000000E+00 0.000000000000000E+00 0.000000000000000E+00 0.000000000000000E+00 diff --git a/ci/G1V03L3Fi/compare.h5 b/ci/G1V03L3Fi/compare.h5 new file mode 100644 index 0000000000000000000000000000000000000000..4e8dd8ba72cd4307de242bb46d9abedf4412a426 GIT binary patch literal 464736 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 Date: Thu, 12 Dec 2024 19:58:44 +0100 Subject: [PATCH 3/6] small test bugfix --- .gitlab-ci.yml | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 94d8c6b5..0aca183c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -31,19 +31,38 @@ stable_force_free_sheet: image: csmiet/testspec script: - source source.sh - - cd ci/G1V03L2Fi - - xspec G1V03L2Fi.001.sp - - python3 -m py_spec.ci.test compare.h5 G1V03L2Fi.001.sp.h5 + - cd ci/G1V03L0Fi + - xspec G1V03L0Fi.sp + - python3 -m py_spec.ci.test compare.h5 G1V03L0Fi.sp.h5 #comparison python3 -m py_spec.ci.testspec f1 f2 artifacts: when: always paths: - - ci/G1V03L2Fi/G1V03L2Fi.001.sp.h5 + - ci/G1V03L0Fi/G1V03L0Fi.sp.h5 expire_in: 1 week dependencies: - build:centos7 # reproduce: -# docker run -v `pwd`:`pwd` -w `pwd` csmiet/testspec sh -c 'source ./source.sh;cd ci/G1V03L2Fi; xspec G1V03L2Fi.001.sp; python3 -m py_spec.ci.test compare.h5 G1V03L2Fi.001.sp.h5' +# docker run -v `pwd`:`pwd` -w `pwd` csmiet/testspec sh -c 'source ./source.sh;cd ci/G1V03L0Fi; xspec G1V03L0Fi.sp; python3 -m py_spec.ci.test compare.h5 G1V03L0Fi.sp.h5' + +stable_force_free_sheet_lcons3: + stage: test + image: csmiet/testspec + script: + - source source.sh + - cd ci/G1V03L3Fi + - xspec G1V03L3Fi.sp + - python3 -m py_spec.ci.test compare.h5 G1V03L3Fi.sp.h5 + #comparison python3 -m py_spec.ci.testspec f1 f2 + artifacts: + when: always + paths: + - ci/G1V03L3Fi/G1V03L3Fi.sp.h5 + expire_in: 1 week + dependencies: + - build:centos7 +# reproduce: +# docker run -v `pwd`:`pwd` -w `pwd` csmiet/testspec sh -c 'source ./source.sh;cd ci/G1V03L3Fi; xspec G1V03L3Fi.sp; python3 -m py_spec.ci.test compare.h5 G1V03L3Fi.sp.h5' cylindrical_many_volumes: stage: test From 291d58a88861cd56a579a93f2bfd45e6f766ae61 Mon Sep 17 00:00:00 2001 From: ErolBa Date: Thu, 12 Dec 2024 20:05:06 +0100 Subject: [PATCH 4/6] more test fixes --- .github/workflows/build.yml | 12 +++++++++--- .github/workflows/build_cmake.yml | 12 +++++++++--- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d6b8fb7a..2dd748a1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,10 +33,16 @@ jobs: make BUILD_ENV=gfortran_ubuntu dspec - name: run_fast_cartesian run: | - cd ${SPEC_PATH}/ci/G1V03L2Fi + cd ${SPEC_PATH}/ci/G1V03L0Fi export OMP_NUM_THREADS=1 - mpiexec -n 2 --allow-run-as-root ${SPEC_PATH}/xspec G1V03L2Fi.001.sp - python3 -m py_spec.ci.test compare.h5 G1V03L2Fi.001.sp.h5 + mpiexec -n 2 --allow-run-as-root ${SPEC_PATH}/xspec G1V03L0Fi.sp + python3 -m py_spec.ci.test compare.h5 G1V03L0Fi.sp.h5 + - name: run_fast_cartesian_lcons3 + run: | + cd ${SPEC_PATH}/ci/G1V03L3Fi + export OMP_NUM_THREADS=1 + mpiexec -n 2 --allow-run-as-root ${SPEC_PATH}/xspec G1V03L3Fi.sp + python3 -m py_spec.ci.test compare.h5 G1V03L3Fi.sp.h5 - name: run_fast_cylinder run: | cd ${SPEC_PATH}/ci/G2V32L1Fi diff --git a/.github/workflows/build_cmake.yml b/.github/workflows/build_cmake.yml index 3ea86651..60496cd5 100644 --- a/.github/workflows/build_cmake.yml +++ b/.github/workflows/build_cmake.yml @@ -39,10 +39,16 @@ jobs: # cmake --install . - name: run_fast_cartesian run: | - cd ${SPEC_PATH}/ci/G1V03L2Fi + cd ${SPEC_PATH}/ci/G1V03L0Fi export OMP_NUM_THREADS=1 - mpiexec -n 2 --allow-run-as-root $SPEC_PATH/install/bin/xspec G1V03L2Fi.001.sp - python3 -m py_spec.ci.test compare.h5 G1V03L2Fi.001.sp.h5 + mpiexec -n 2 --allow-run-as-root $SPEC_PATH/install/bin/xspec G1V03L0Fi.sp + python3 -m py_spec.ci.test compare.h5 G1V03L0Fi.sp.h5 + - name: run_fast_cartesian_lcons3 + run: | + cd ${SPEC_PATH}/ci/G1V03L3Fi + export OMP_NUM_THREADS=1 + mpiexec -n 2 --allow-run-as-root $SPEC_PATH/install/bin/xspec G1V03L3Fi.sp + python3 -m py_spec.ci.test compare.h5 G1V03L3Fi.sp.h5 - name: run_fast_cylinder run: | cd ${SPEC_PATH}/ci/G2V32L1Fi From 95174fa946c027247d980b0f1259ca36479cd3bd Mon Sep 17 00:00:00 2001 From: ErolBa Date: Wed, 18 Dec 2024 09:23:20 +0100 Subject: [PATCH 5/6] Addressing Chris' comments --- .gitlab-ci.yml | 140 ------------------------------------------------- src/dforce.f90 | 6 +++ src/hesian.f90 | 3 +- 3 files changed, 8 insertions(+), 141 deletions(-) delete mode 100644 .gitlab-ci.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 0aca183c..00000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,140 +0,0 @@ -stages: - - lint - - build - - test - -checkbadchars: - stage: lint - script: > - test $(grep -caxv '.*' *.f *.f90 *.h README* | - cut -d: -f2 | awk '{ SUM += $1} END { print SUM }') -eq 0 - -enforce_unixish: - stage: lint - script: test $(file -k *.f *.f90 *.h | grep -c "CRLF") -eq 0 - -build:centos7: - stage: build - image: csmiet/testspec - script: - - make CC=gfortran xspec - artifacts: - paths: - - xspec - expire_in: 1 week - -# do it yourself: -# docker run -v `pwd`:`pwd` -w `pwd` csmiet/testspec make CC=gfortran xspec - -stable_force_free_sheet: - stage: test - image: csmiet/testspec - script: - - source source.sh - - cd ci/G1V03L0Fi - - xspec G1V03L0Fi.sp - - python3 -m py_spec.ci.test compare.h5 G1V03L0Fi.sp.h5 - #comparison python3 -m py_spec.ci.testspec f1 f2 - artifacts: - when: always - paths: - - ci/G1V03L0Fi/G1V03L0Fi.sp.h5 - expire_in: 1 week - dependencies: - - build:centos7 -# reproduce: -# docker run -v `pwd`:`pwd` -w `pwd` csmiet/testspec sh -c 'source ./source.sh;cd ci/G1V03L0Fi; xspec G1V03L0Fi.sp; python3 -m py_spec.ci.test compare.h5 G1V03L0Fi.sp.h5' - -stable_force_free_sheet_lcons3: - stage: test - image: csmiet/testspec - script: - - source source.sh - - cd ci/G1V03L3Fi - - xspec G1V03L3Fi.sp - - python3 -m py_spec.ci.test compare.h5 G1V03L3Fi.sp.h5 - #comparison python3 -m py_spec.ci.testspec f1 f2 - artifacts: - when: always - paths: - - ci/G1V03L3Fi/G1V03L3Fi.sp.h5 - expire_in: 1 week - dependencies: - - build:centos7 -# reproduce: -# docker run -v `pwd`:`pwd` -w `pwd` csmiet/testspec sh -c 'source ./source.sh;cd ci/G1V03L3Fi; xspec G1V03L3Fi.sp; python3 -m py_spec.ci.test compare.h5 G1V03L3Fi.sp.h5' - -cylindrical_many_volumes: - stage: test - image: csmiet/testspec - script: - - source source.sh - - cd ci/G2V32L1Fi - - xspec G2V32L1Fi.001.sp - - python3 -m py_spec.ci.test compare.h5 G2V32L1Fi.001.sp.h5 - artifacts: - when: always - paths: - - ci/G2V32L1Fi/G2V32L1Fi.001.sp.h5 - expire_in: 1 week - dependencies: - - build:centos7 -# reproduce: -# docker run -v `pwd`:`pwd` -w `pwd` csmiet/testspec sh -c 'source ./source.sh; cd ci/G2V32L1Fi; xspec G2V32L1Fi.001.sp; python3 -m py_spec.ci.test compare.h5 G2V32L1Fi.001.sp.h5 ' - -toroidal_freeboundary_vacuum: - stage: test - image: csmiet/testspec - script: - - source source.sh - - cd ci/toroidal_freeboundary_vacuum - - mpirun -n 4 --allow-run-as-root xspec G3V02L0Fr.sp - - python3 -m py_spec.ci.test compare.h5 G3V02L0Fr.sp.h5 --tol 1e-10 - artifacts: - when: always - paths: - - ci/toroidal_freeboundary_vacuum/G3V02L0Fr.sp.h5 - expire_in: 1 week - dependencies: - - build:centos7 -# reproduce: -# docker run -v `pwd`:`pwd` -w `pwd` csmiet/testspec sh -c 'source ./source.sh; cd ci/toroidal_freeboundary_vacuum; mpirun -n 4 --allow-run-as-root xspec G3V02L0Fr.sp; python3 -m py_spec.ci.test compare.h5 G3V02L0Fr.sp.h5' -# -# -CurrentConstraint_fixed: - stage: test - image: csmiet/testspec - script: - - source source.sh - - cd ci/G3V08L3Fi - - mpirun -n 4 --allow-run-as-root xspec G3V08L3Fi.001.sp - - python3 -m py_spec.ci.test compare.h5 G3V08L3Fi.001.sp.h5 --tol 1e-10 - artifacts: - when: always - paths: - - ci/G3V08L3Fi/G3V08L3Fi.001.sp.h5 - expire_in: 1 week - dependencies: - - build:centos7 -# reproduce: -# docker run -v `pwd`:`pwd` -w `pwd` csmiet/testspec sh -c 'source ./source.sh; cd ci/G3V08L3Fi; mpirun -n 4 --allow-run-as-root xspec G3V08L3Fi.001.sp; python3 -m py_spec.ci.test compare.h5 G3V08L3Fi.001.sp.h5' -# - - -CurrentConstraint_free: - stage: test - image: csmiet/testspec - script: - - source source.sh - - cd ci/G3V08L3Fr - - mpirun -n 4 --allow-run-as-root xspec G3V08L3Fr.001.sp - - python3 -m py_spec.ci.test compare.h5 G3V08L3Fr.001.sp.h5 --tol 1e-10 - artifacts: - when: always - paths: - - ci/G3V08L3Fr/G3V08L3Fr.001.sp.h5 - expire_in: 1 week - dependencies: - - build:centos7 -# reproduce: -# docker run -v `pwd`:`pwd` -w `pwd` csmiet/testspec sh -c 'source ./source.sh; cd ci/G3V08L3Fr; mpirun -n 4 --allow-run-as-root xspec G3V08L3Fr.001.sp; python3 -m py_spec.ci.test compare.h5 G3V08L3Fr.001.sp.h5' diff --git a/src/dforce.f90 b/src/dforce.f90 index 746513cb..3228b0a3 100644 --- a/src/dforce.f90 +++ b/src/dforce.f90 @@ -78,6 +78,12 @@ !> information is then broadcasted to the MPI node \f$0\f$ in dforce() and the global force is evaluated.
  • !> !> +!> **prints out the force gradient matrix .hessian** +!> +!> +!> !> **construct derivatives of matrix equation** !> !>