HCJung-jbnu / ROMS-TOPAZ

ROMS + TOPAZ coupling
0 stars 0 forks source link

ROMS+TOPAZ initial 과정 접합 내용(prog, diag 초기장 + init o2/co2 air-sea exchange coef. 처방+generic_TOPAZ_init 접합) #4

Closed HyunChaeJung closed 1 year ago

HyunChaeJung commented 1 year ago

TOPAZ 모듈 구축

endif

  IF (.NOT. ALLOCATED(idbio)) THEN
    ALLOCATE(idbio(NBT))
    Dmem(1)=Dmem(1)+REAL(NBT,r8)
  END IF

!----------------------------------------------------------------------- ! 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"

  ic=0
  iCOAL=ic+1 !"Solubility of CO2 for air" "mol/kg/atm"
  iCOSC=ic+2 !"Schmidt number for CO2" "none"
  iCOCS=ic+3 !"Ocean surface gas concentration of CO2" "mol/kg"
  iO2AL=ic+4 !"Solubility of O2 for air " "mol/kg/atm"
  iO2SC=ic+5 !"Schmidt number for O2" "none"
  iO2CS=ic+6 !"Ocean surface gas concentration of O2" "mol/kg"

endif

- varinfo_topaz.dat 작성 완료 : 

'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

- topaz_var.h 작성 완료 (READ varinfo_topaz.dat)

/* 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

- topaz_inp.h 구축 (READ bio_topaz.in)
  SUBROUTINE read_BioPar (model, inp, out, Lwrite)

  USE mod_param
  USE mod_parallel
  USE mod_biology
  USE mod_ncparam
  USE mod_scalars
        .................
  DO WHILE (.TRUE.)
    READ (inp,'(a)',ERR=10,END=20) line
    status=decode_line(line, KeyWord, Nval, Cval, Rval)
    IF (status.gt.0) THEN
      SELECT CASE (TRIM(KeyWord))
        CASE ('Lbiology')
          Npts=load_l(Nval, Cval, Ngrids, Lbiology)
        CASE ('BioIter')
          Npts=load_i(Nval, Rval, Ngrids, BioIter)
        CASE ('TNU2')
          Npts=load_r(Nval, Rval, NBT, Ngrids, Rbio)
          DO ng=1,Ngrids
            DO itrc=1,NBT
              i=idbio(itrc)
              nl_tnu2(i,ng)=Rbio(itrc,ng)
            END DO
          END DO
        CASE ('TNU4')
          Npts=load_r(Nval, Rval, NBT, Ngrids, Rbio)
          DO ng=1,Ngrids
            DO itrc=1,NBT
              i=idbio(itrc)
              nl_tnu4(i,ng)=Rbio(itrc,ng)
            END DO
          END DO
        .................     

ifdef DIAGNOSTICS_BIO

        CASE ('Dout(iIRRM)')
          IF (iDbio3(iIRRM).eq.0) THEN
            IF (Master) WRITE (out,40) 'iDbio3(iIRRM)'
            exit_flag=5
            RETURN
          END IF
          Npts=load_l(Nval, Cval, Ngrids, Lbio)
          i=iDbio3(iIRRM)
          DO ng=1,Ngrids
            Dout(i,ng)=Lbio(ng)
          END DO
        CASE ('Dout(iHTTL)')
          IF (iDbio3(iHTTL).eq.0) THEN
            IF (Master) WRITE (out,40) 'iDbio3(iHTTL)'
            exit_flag=5
            RETURN
          END IF
          Npts=load_l(Nval, Cval, Ngrids, Lbio)
          i=iDbio3(iHTTL)
          DO ng=1,Ngrids
            Dout(i,ng)=Lbio(ng)
          END DO
        CASE ('Dout(iSBTF)')
          IF (iDbio3(iSBTF).eq.0) THEN
            IF (Master) WRITE (out,40) 'iDbio3(iSBTF)'
            exit_flag=5
            RETURN
          END IF
          Npts=load_l(Nval, Cval, Ngrids, Lbio)
          i=iDbio3(iSBTF)
          DO ng=1,Ngrids
            Dout(i,ng)=Lbio(ng)
          END DO

................

ifdef DIAGNOSTICS_BIO

        IF (nDIA(ng).gt.0) THEN
          IF (NDbio3d.gt.0) THEN
            DO itrc=1,NDbio3d
              i=iDbio3(itrc)
              IF (Dout(i,ng)) WRITE (out,130)                         &
 &                Dout(i,ng), 'Dout(iDbio3)',                         &
 &                'Write out diagnostics for', TRIM(Vname(1,i))
            END DO
          END IF
          IF (NDbio2d.gt.0) THEN

! 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

............

- topaz.h 껍데기 구축 <-- sms module
  MODULE biology_mod

  IMPLICIT NONE

  PRIVATE
  PUBLIC :: biology

  CONTAINS

  SUBROUTINE biology (ng, tile)

    IMPLICIT NONE

    INTEGER, INTENT(IN) :: ng, tile

    print*,'hcjung test biology'

    RETURN
  END SUBROUTINE biology

  END MODULE biology_mod
HyunChaeJung commented 1 year ago

ROMS + TOPAZ init 모듈 결합

if defined BIO_FENNEL

include

elif defined TOPAZ

include

...

- ~/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

ifdef TOPAZ

! ! 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, &

ifdef MASKING

 &                            GRID(ng) % rmask,                     &

endif

ifdef CHECKSUM

 &                            dummy_tracer(:,:,:,Tindex,1)),        &
 &                            checksum = Fhash)

else

 &                            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, &

ifdef MASKING

 &                            GRID(ng) % rmask,                     &

endif

ifdef CHECKSUM

 &                            dummy_tracer(:,:,Tindex,1,1)),        &
 &                            checksum = Fhash)

else

 &                            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

ifdef TOPAZ

  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

ifdef WET_DRY

      TP(ng)%tmask(isd:ied,jsd:jed,nk)=GRID(ng)%rmask_wet(isd:ied,jsd:jed) !rho mask

endif

    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

endif

.........

HyunChaeJung commented 1 year ago

ISSUE

HyunChaeJung commented 1 year ago

ROMS info

mod_scalars.F dt

get_state.F diag. init -> topaz

tile = myrank

ROMS vertical nk 1=bottom, N(ng)=top

HyunChaeJung commented 1 year ago

generic_TOPAZ_mode.F90 수정