60 likes | 168 Views
TIEGCM Lower Boundary Code Structure. TGCM Main. i nit Set gswm flags. i nit_lbc Allocate tlbc,ulbc,vlbc. r eadsource Read tlbc , ulbc , vlbc. lowbound Set Hough mode params. advance. a dvance (called by TGCM). addiag. dynamics. getgswm. l bc_gswm_addiag. r dgswm
E N D
TIEGCM Lower Boundary Code Structure TGCM Main init Set gswm flags init_lbc Allocate tlbc,ulbc,vlbc readsource Read tlbc, ulbc, vlbc lowbound Set Hough mode params advance
advance (called by TGCM) addiag dynamics getgswm lbc_gswm_addiag rdgswm Read gswm data file mkgswm Define gswm module data addiag ! ! Use GSWM lbc for geopotential height if requested: if (igetgswm > 0) then call lbc_gswm_addiag(z(1,lon0:lon1,lat0:lat1),lon0,lon1, lat0,lat1) endif ! ! If not using gswmlbc, add in tidal components: if (igetgswm <= 0) then ! ! z(1) = zb expt=cex p(ci*freq_semidi*dt*iter) do i=lon0,lon1 z(1,i,j) = real(zb(j)*bnd(i)*expt) enddo ! ! Add in effect of (1,1) tidal component to lbc expt = cexp(ci*.5*freq_semidi*dt*iter) do i=lon0,lon1 z(1,i,j) = z(1,i,j)+real(zb2(j)*bnd2(i)*expt) enddo endif ! igetgswm <= 0 ! ! Add background lower boundary of Z (zbound is in cons.F): z(1,lon0:lon1,j) = z(1,lon0:lon1,j)+zbound getgswm ! ! Get gswm migrating diurnal tide data: if (igswm_mi_di > 0) then if (istep==1) call rdgswm(gswm_mi_di_ncfile,'mi_di') call mkgswm(iyear,iday,int(secs),iprint,'mi_di') endif ! ! Get gswm migrating semi-diurnal tide data: if (igswm_mi_sdi > 0) then if (istep==1) call rdgswm(gswm_mi_sdi_ncfile,'mi_sdi') call mkgswm(iyear,iday,int(secs),iprint,'mi_sdi') endif ! ! Get gswm non-migrating diurnal tide data: if (igswm_nm_di > 0) then if (istep==1) call rdgswm(gswm_nm_di_ncfile,'nm_di') call mkgswm(iyear,iday,int(secs),iprint,'nm_di') endif ! ! Get gswm non-migrating semi-diurnal tide data: if (igswm_nm_sdi > 0) then if (istep==1) call rdgswm(gswm_nm_sdi_ncfile,'nm_sdi') call mkgswm(iyear,iday,int(secs),iprint,'nm_sdi') endif
dynamics (called by advance) dt (update TN) duv (update U,V) lbc_gswm_dt lbc_gswm_duv dt if (igetgswm > 0) then call lbc_gswm_dt(tnlbc,lon0,lon1,lat0,lat1) else ! no gswm rstep = float(step) expt = cexp(ci*freq_semidi*rstep*iter) expt2 = cexp(ci*.5*freq_semidi*rstep*iter) endif ! do lat=lat0,lat1 ! ! Calculate lbc if gswm was not used (see above): if (igetgswm <= 0) then do i=lon0,lon1 tnlbc(i,lat) = real(tb(lat)*bnd(i)*expt)+tbound ! semidi tnlbc(i,lat) = tnlbc(i,lat)+real(tb2(lat)*bnd2(i)*expt2) ! diurnal enddo ! i=lon0,lon1 endif duv if (igetgswm> 0) then ! ! Use GSWM lbc: call lbc_gswm_duv(unlbc,vnlbc,unlbc_diag,vnlbc_diag, | lon0,lon1,lat,lev0,lev1,expt,expt2,expta) ! ! U,V bottom boundary (non-gswm): else ! non-gswm ! ! Semidiurnal tide: do i=lon0,lon1 unlbc(i) = real(ub(lat)*bnd(i)*expt) vnlbc(i) = real(vb(lat)*bnd(i)*expt) ! ! Diurnal tide: unlbc(i) = unlbc(i) + real(ub2(lat)*bnd2(i)*expt2) vnlbc(i) = vnlbc(i) + real(vb2(lat)*bnd2(i)*expt2) enddo ! i=lon0,lon1 endif ! gswm
lbc_gswm_addiag (bndry.F) (called by addiag) ! GSWM migrating diurnal and semi-diurnal: if(igswm_mi_di == 1.and.igswm_mi_sdi == 1) then do j = lat0,lat1 do i=lon0,lon1 z(i,j) = gswm_mi_sdi_z(i,j) ! semidiurnal tide z(i,j) = z(i,j)+ gswm_mi_di_z(i,j) ! diurnal tide enddo enddo ! ! GSWM migrating semi-diurnal: elseif(igswm_mi_di == 0.and.igswm_mi_sdi == 1) then do j = lat0,lat1 do i=lon0,lon1 z(i,j) = gswm_mi_sdi_z(i,j) z(i,j) = z(i,j)+real(zb2(j)*bnd2(i)*expt2) enddo enddo ! ! GSWM migrating diurnal: elseif(igswm_mi_di == 1.and.igswm_mi_sdi == 0) then do j = lat0,lat1 do i=lon0,lon1 z(i,j) = real(zb(j)*bnd(i)*expt z(i,j) = z(i,j)+ gswm_mi_di_z(i,j enddo enddo ! ! No gswm: else do j = lat0,lat1 do i=lon0,lon1 z(i,j) = real(zb(j)*bnd(i)*expt) z(i,j) = z(i,j)+real(zb2(j)*bnd2(i)*expt2 enddo enddo endif ! ! GSWM non-migrating diurnal: if(igswm_nm_di == 1) then do j = lat0,lat1 do i=lon0,lon1 z(i,j) = z(i,j)+ gswm_nm_di_z(i,j) enddo enddo endif ! ! GSWM non-migrating semi-diurnal: if(igswm_nm_sdi == 1) then do j = lat0,lat1 do i=lon0,lon1 z(i,j) = z(i,j)+ gswm_nm_sdi_z(i,j) enddo enddo endif
lbc_gswm_dt (bndry.F) (called by dt) ! ! GSWM migrating diurnal and semi-diurnal: if(igswm_mi_di== 1.and.igswm_mi_sdi == 1) then do lat=lat0,lat1 do i=lon0,lon1 tnlbc(i,lat) = gswm_mi_sdi_t(i,lat)+tbound tnlbc(i,lat) = tnlbc(I,lat)+ gswm_mi_di_t(i,lat) enddo! i=lon0,lon1 enddo! j=lat0,lat1 ! ! GSWM migrating semi-diurnal: elseif(igswm_mi_di== 0.and.igswm_mi_sdi == 1) then do lat=lat0,lat1 do i=lon0,lon1 tnlbc(i,lat) = gswm_mi_sdi_t(i,lat)+tbound tnlbc(i,lat) = tnlbc(i,lat)+ real(tb2(lat)*bnd2(i)*expt2) enddo! i=lon0,lon1 enddo ! j=lat0,lat1 ! ! GSWM migrating diurnal: elseif(igswm_mi_di== 1.and.igswm_mi_sdi == 0) then do lat=lat0,lat1 do i=lon0,lon1 tnlbc(i,lat) = real(tb(lat)*bnd(i)*expt)+tbound tnlbc(i,lat) = tnlbc(i,lat)+ gswm_mi_di_t(i,lat) enddo! i=lon0,lon1 enddo! j=lat0,lat1 else ! ! No gswm: do lat=lat0,lat1 do i=lon0,lon1 tnlbc(i,lat) = real(tb(lat)*bnd(i)*expt)+tbound tnlbc(i,lat) = tnlbc(i,lat)+ real(tb2(lat)*bnd2(i)*expt2) enddo! i=lon0,lon1 enddo! j=lat0,lat1 endif ! ! GSWM non-migrating diurnal: if(igswm_nm_di== 1) then do lat=lat0,lat1 do i=lon0,lon1 tnlbc(i,lat) = tnlbc(i,lat)+ gswm_nm_di_t(i,lat) enddo! i=lon0,lon1 enddo! j=lat0,lat1 endif ! ! GSWM non-migrating semi-diurnal: if(igswm_nm_sdi== 1) then do lat=lat0,lat1 do i=lon0,lon1 tnlbc(i,lat) = tnlbc(i,lat)+ gswm_nm_sdi_t(i,lat) enddo! i=lon0,lon1 enddo! j=lat0,lat1 endif
lbc_gswm_duv (bndry.F) (called by duv) ! ! GSWM migrating diurnal and semi-diurnal: if(igswm_mi_di== 1.and.igswm_mi_sdi == 1) then do i=lon0,lon1 unlbc(i) = gswm_mi_sdi_u(i,lat) vnlbc(i) = gswm_mi_sdi_v(i,lat) unlbc(i) = unlbc(i) + gswm_mi_di_u(i,lat) vnlbc(i) = vnlbc(i) + gswm_mi_di_v(i,lat) unlbc_diag(:,i) = unlbc(i) enddo! i=lon0,lon1 ! ! GSWM migrating semi-diurnal: elseif(igswm_mi_di== 0.and.igswm_mi_sdi == 1) then do i=lon0,lon1 unlbc(i) = gswm_mi_sdi_u(i,lat) vnlbc(i) = gswm_mi_sdi_v(i,lat) unlbc(i) = unlbc(i) + real(ub2(lat)*bnd2(i)*expt2) vnlbc(i) = vnlbc(i) + real(vb2(lat)*bnd2(i)*expt2) unlbc_diag(:,i) = unlbc(i) enddo! i=lon0,lon1 ! ! GSWM migrating diurnal: elseif(igswm_mi_di== 1.and.igswm_mi_sdi == 0) then do i=lon0,lon1 unlbc(i) = real(ub(lat)*bnd(i)*expt) vnlbc(i) = real(vb(lat)*bnd(i)*expt) unlbc(i) = unlbc(i) + gswm_mi_di_u(i,lat) vnlbc(i) = vnlbc(i) + gswm_mi_di_v(i,lat) enddo! i=lon0,lon1 ! ! No gswm: else do i=lon0,lon1 unlbc(i) = real(ub(lat)*bnd(i)*expt) vnlbc(i) = real(vb(lat)*bnd(i)*expt) unlbc(i) = unlbc(i) + real(ub2(lat)*bnd2(i)*expt2 vnlbc(i) = vnlbc(i) + real(vb2(lat)*bnd2(i)*expt2) unlbc_diag(:,i) = unlbc(i) enddo! i=lon0,lon1 endif ! ! GSWM non-migrating diurnal: if(igswm_nm_di== 1) do i=lon0,lon1 unlbc(i) = unlbc(i) + gswm_nm_di_u(i,lat) vnlbc(i) = vnlbc(i) + gswm_nm_di_v(i,lat) enddo! i=lon0,lon1 endif ! ! GSWM non-migrating semi-diurnal: if(igswm_nm_sdi== 1) do i=lon0,lon1 unlbc(i) = unlbc(i) + gswm_nm_sdi_u(i,lat) vnlbc(i) = vnlbc(i) + gswm_nm_sdi_v(i,lat) enddo! i=lon0,lon1 endif