Closed HyunChaeJung closed 1 year ago
#ifdef BIOLOGY
# if defined BIO_FENNEL
# include <fennel_mod.h>
# elif defined TOPAZ
# include <topaz_mod.h> <-- TOPAZ 모듈 추가
#ifdef BIOLOGY
# if defined BIO_FENNEL
# include <fennel_var.h>
# elif defined TOPAZ
# include <topaz_var.h> !!add topaz hcjung 20230313
# elif defined ECOSIM
# if defined BIO_FENNEL
# include <fennel_inp.h>
# elif defined TOPAZ
# include <topaz_inp.h>
# elif defined ECOSIM
# include <ecosim_inp.h>
VARNAME = ./varinfo_topaz.dat
*/
/* add topaz hcjung 20230310 */
...
- ~/ROMS/Utility/get_state.F : TOPAZ diag init 값/o2,co2 air-sea flux init 값 read -> ocean_var_4topaz 로 전달
- varinfo_topaz.dat에 변수 등록 -> get_state.F에서 READ
! ! Read in nonlinear diagnostic tracer type variables. (initial condition) ! !!!iDbio3d is=BOUNDS(ng)%Istr(tile); ie=BOUNDS(ng)%Jend(tile) js=BOUNDS(ng)%Jstr(tile); je=BOUNDS(ng)%Jend(tile) ndiag=0 DO itrc=1,NDbio3d ....... status=nf_fread3d(ng, IDmod, ncname, ncINPid, & & Vname(1,iDbio3(itrc)), varid, & & InpRec, gtype, Vsize, & & LBi, UBi, LBj, UBj, 1, N(ng), & & Fscl, Fmin, Fmax, &
& GRID(ng) % rmask, &
& dummy_tracer(:,:,:,Tindex,1)), &
& checksum = Fhash)
& dummy_tracer(:,:,:,Tindex,1))
DO k = 1, N(ng)
DO j = js, je
DO i = is, ie
TP(ng)%diag_trc(i,j,k,ndiag)=dummy_tracer(i,j,N(ng)-k+1,Tindex,1)
END DO
END DO
END DO
....... !!!iDbio2d DO itrc=NDbio3d+1,NDbio3d+NDbio2d foundit=find_string(var_name, n_var, & & TRIM(Vname(1,iDbio2(itrc))), varid) ....... status=nf_fread2d(ng, IDmod, ncname, ncINPid, & & Vname(1,iDbio2(itrc)), varid, & & InpRec, gtype, Vsize, & & LBi, UBi, LBj, UBj, & & Fscl, Fmin, Fmax, &
& GRID(ng) % rmask, &
& dummy_tracer(:,:,Tindex,1,1)), &
& checksum = Fhash)
& dummy_tracer(:,:,Tindex,1,1))
IF ( TRIM(Vname(1,iDbio2(itrc))) .EQ. 'CO2_FLUX_ALPHA_OCN' ) THEN
TP(ng)%co2_flux_alpha(is:ie,js:je)=dummy_tracer(is:ie,js:je,Tindex,1,1)
ELSE IF ( TRIM(Vname(1,iDbio2(itrc))) .EQ. 'CO2_FLUX_SC_NO_OCN' ) THEN
TP(ng)%co2_flux_sc_no(is:ie,js:je)=dummy_tracer(is:ie,js:je,Tindex,1,1)
ELSE IF ( TRIM(Vname(1,iDbio2(itrc))) .EQ. 'CO2_FLUX_CSURF_OCN' ) THEN
TP(ng)%co2_flux_csurf(is:ie,js:je)=dummy_tracer(is:ie,js:je,Tindex,1,1)
ELSE IF ( TRIM(Vname(1,iDbio2(itrc))) .EQ. 'O2_FLUX_ALPHA_OCN' ) THEN
TP(ng)%o2_flux_alpha(is:ie,js:je)=dummy_tracer(is:ie,js:je,Tindex,1,1)
ELSE IF ( TRIM(Vname(1,iDbio2(itrc))) .EQ. 'O2_FLUX_SC_NO_OCN' ) THEN
TP(ng)%o2_flux_sc_no(is:ie,js:je)=dummy_tracer(is:ie,js:je,Tindex,1,1)
ELSE IF ( TRIM(Vname(1,iDbio2(itrc))) .EQ. 'O2_FLUX_CSURF_OCN' ) THEN
TP(ng)%o2_flux_csurf(is:ie,js:je)=dummy_tracer(is:ie,js:je,Tindex,1,1)
END IF
.......
- ~/ROMS/Nonlinear/initial.F <-- generic_TOPAZ_init 추가, tmask, mbathy, area=e1t*e2t 정보 등 전달
........ !!add topaz hcjung 20230320
DO ng=1,Ngrids
DO tile=first_tile(ng),last_tile(ng),+1
is = BOUNDS(ng)%Istr(tile); ie = BOUNDS(ng)%Iend(tile)
js = BOUNDS(ng)%Jstr(tile); je = BOUNDS(ng)%Jend(tile)
isd= BOUNDS(ng)%LBi(tile); ied = BOUNDS(ng)%UBi(tile)
jsd= BOUNDS(ng)%LBj(tile); jed = BOUNDS(ng)%UBj(tile)
CALL generic_TOPAZ_init( ng, Ngrids, is, ie, js, je, &
isd, ied, jsd, jed, N(ng), dt(ng) )
!Determine the coast line.
!In order to that grid_tmask must have the proper value on the data domain boundaries isd,ied,jsd,jed
!so that we can decide if the coast line coinsides with a point on the compute domain boundary
DO nk = 1, N(ng)
TP(ng)%tmask(isd:ied,jsd:jed,nk)=GRID(ng)%rmask(isd:ied,jsd:jed) !rho mask
TP(ng)%tmask(isd:ied,jsd:jed,nk)=GRID(ng)%rmask_wet(isd:ied,jsd:jed) !rho mask
END DO
TP(ng)%mbathy(is:ie,js:je)=N(ng) ! sigma coord
TP(ng)%area(is:ie,js:je)=GRID(ng)%omn(is:ie,js:je) ! area(m2)
END DO
END DO
.........
ROMS grid 정보 변수
mod_param.F
print*,'hcjung index',LBi, UBi, LBj, UBj
0~780, 0~576
integer, allocatable :: Lm(:) = 779
integer, allocatable :: Mm(:) = 575
!
! Global horizontal size of model arrays including padding. All the
! model state arrays are of same size to facilitate parallelization.
!
integer, allocatable :: Im(:) = 779
integer, allocatable :: Jm(:) = 575
N(:)
Ngrids(do ng = 1, Ngrids)
mod_scalars.F dt
get_state.F diag. init -> topaz
tile = myrank
ROMS vertical nk 1=bottom, N(ng)=top
TOPAZ 모듈 구축
topaz_mod.h 생성 : ROMS OCEAN%t 등록을 위해 topaz prog, diag 변수의 index number 생성
endif
!----------------------------------------------------------------------- ! Initialize tracer identification indices. !----------------------------------------------------------------------- ! !! Prognostic ic=NAT+NPT+NCS+NNS DO i=1,NBT idbio(i)=ic+i END DO
!! Prognostic ic=0 ic=NAT+NPT+NCS+NNS iSIO4=ic+1 !"Silicate Concentration" "mol/kg" iSILG=ic+2 !"Large Silicon Concentration" "mol/kg" iSIDT=ic+3 !"Detrital Silicon Concentration" "mol/kg" iSDOP=ic+4 !"Semilabile DOP Concentration" "mol/kg" iSDON=ic+5 !"Semilabile DON Concentration" "mol/kg" iPSM=ic+6 !"Small Phosphorus Concentration" "mol/kg" iPO4=ic+7 !"Phosphate Concentration" "mol/kg" iPLG=ic+8 !"Large Phosphorus Concentration" "mol/kg" iPDI=ic+9 !"Diaz Phosphorus Concentration" "mol/kg" iPDET=ic+10 !"Detrital Phosphorus Concentration" "mol/kg" iO2_=ic+11 !"Oxygen Concentration" "mol/kg" iNSM=ic+12 !"Small Nitrogen Concentration" "mol/kg" iNO3=ic+13 !"Nitrate Concentration" "mol/kg" iNH4=ic+14 !"Ammonia Concentration" "mol/kg" iNLG=ic+15 !"Large Nitrogen Concentration" "mol/kg" iNHET=ic+16 !"Heterotrophic Nitrogen Concentration" "mol/kg" iNDI=ic+17 !"Diazotroph Nitrogen Concentration" "mol/kg" iNDET=ic+18 !"Detrital Nitrogen Concentration" "mol/kg" iLDET=ic+19 !"Detrital Lith Concentration" "mol/kg" iLITH=ic+20 !"Lithogenic Aluminosilicate Concentration" "mol/kg" iLDON=ic+21 !"Labile DON Concentration" "mol/kg" iFESM=ic+22 !"Small Iron Concentration" "mol/kg" iFELG=ic+23 !"Large Iron Concentration" "mol/kg" iFEDI=ic+24 !"Diazotroph Iron Concentration" "mol/kg" iFEDT=ic+25 !"Detrital Iron Concentration" "mol/kg" iFED=ic+26 !"Dissolved Iron Concentration" "mol/kg" iDIC=ic+27 !"Dissolved Inorganic Carbon Concentration" "mol/kg" iCCAL=ic+28 !"Detrital Calcite Concentration" "mol/kg" iCARG=ic+29 !"Detrital Aragonite Concentration" "mol/kg" iALK_=ic+30 !"Alkalinity Concentration" "mol/kg"
!! Diagnostic ic=0 iIRRM=ic+1 !"Irradiance Memory" "mol/kg" iHTTL=ic+2 !"H+ ion Concentration" "mol/kg" iSBTF=ic+3 !"SiO2 flux to Sediments" "mol/kg" iPBTF=ic+4 !"P flux to Sediments" "mol/kg" iNBTF=ic+5 !"N flux to Sediments" "mol/kg" iLBTF=ic+6 !"Lith flux to Sediments" "mol/kg" iCCBF=ic+7 !"Calcite flux to Sediments" "mol/kg" iCABF=ic+8 !"Aragonite flux to Sediments" "mol/kg" iCION=ic+9 !"Carbonate ion Concentration" "mol/kg" iCHL_=ic+10 !"Chlorophyll Concentration" "mol/kg" iCASD=ic+11 !"Sediment CaCO3" "mol/kg"
endif
prog 'SIO4' 'Silicate Concentration' 'mol/kg' 'SIO4, scalar, series' 'ocean_time' 'idTvar(iSIO4)' 'r3dvar' 1.0d0
diag 'IRR_MEM' 'Irradiance Memory' 'mol/kg' 'IRR_MEM, scalar, series' 'ocean_time' 'iDbio3(iIRRM)' 'r3dvar' 1.0d0
bry for prog 'SIO4_east' 'Silicate Concentration' 'mol/kg' 'SIO4_east, scalar, series' 'SIO4_time' 'idTbry(ieast, iSIO4)' 'nulvar' 1.0d0
'SIO4_west' 'Silicate Concentration' 'mol/kg' 'SIO4_west, scalar, series' 'SIO4_time' 'idTbry(iwest, iSIO4)' 'nulvar' 1.0d0
'SIO4_south' 'Silicate Concentration' 'mol/kg' 'SIO4_south, scalar, series' 'SIO4_time' 'idTbry(isouth, iSIO4)' 'nulvar' 1.0d0
'SIO4_north' 'Silicate Concentration' 'mol/kg' 'SIO4_north, scalar, series' 'SIO4_time' 'idTbry(inorth, iSIO4)' 'nulvar' 1.0d0
/* Model state biological tracers. / CASE ('idTvar(iSIO4)') !1 idTvar(iSIO4)=varid CASE ('idTvar(iSILG)') !2 idTvar(iSILG)=varid ... / Biological tracers open boundary conditions. / CASE ('idTbry(iwest,iSIO4)') !1 idTbry(iwest,iSIO4)=varid CASE ('idTbry(ieast,iSIO4)') idTbry(ieast,iSIO4)=varid CASE ('idTbry(isouth,iSIO4)') idTbry(isouth,iSIO4)=varid CASE ('idTbry(inorth,iSIO4)') idTbry(inorth,iSIO4)=varid ... / * Biological tracers term diagnostics. / CASE ('iDbio3(iIRRM)') !1 iDbio3(iIRRM)=varid CASE ('iDbio3(iHTTL)') !2 iDbio3(iHTTL)=varid
ifdef DIAGNOSTICS_BIO
................
ifdef DIAGNOSTICS_BIO
! DO itrc=NDbio3d+1,NDbio3d+NDbio2d DO itrc=1,NDbio2d i=iDbio2(itrc) IF (Dout(i,ng)) WRITE (out,130) & & Dout(i,ng), 'Dout(iDbio2)', & & 'Write out diagnostics for', TRIM(Vname(1,i)) END DO END IF END IF
endif
............