60 likes | 171 Views
This document outlines the implementation of the GSWM (Generalized Surface Water Model) lower boundary code structure, focusing on the initialization, allocation, and dynamics of tidal components. It includes the process to read source data for the lower boundary conditions, set boundary flags, and utilize advanced Hough mode parameters. The code structure facilitates the adjustment of geopotential height based on requested values and includes provisions for migrating and non-migrating tidal data. Ultimately, it encapsulates a comprehensive framework for modeling lower boundary interactions in oceanographic simulations.
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