Attachment 'setup1.py'

Download

   1 import sys; sys.path.append('../../py_src')
   2 
   3 from pyOM_gui import pyOM_gui as pyOM
   4 #from pyOM_cdf import pyOM_cdf as pyOM
   5 
   6 from numpy import *
   7 from scipy.io.netcdf import netcdf_file as NF
   8 
   9 class global_4deg(pyOM):
  10    """ global 4 deg model with 15 levels
  11    """
  12    def set_parameter(self):
  13      """set main parameter
  14      """
  15      M=self.fortran.main_module   
  16 
  17      (M.nx,M.ny,M.nz)    = (90,40,15)
  18      M.dt_mom    = 1800.0
  19      M.dt_tracer = 86400.0
  20 
  21      M.coord_degree     = 1
  22      M.enable_cyclic_x  = 1
  23 
  24      M.congr_epsilon = 1e-8
  25      M.congr_max_iterations = 20000
  26      M.enable_streamfunction = 1
  27 
  28      I=self.fortran.isoneutral_module   
  29      I.enable_neutral_diffusion = 1
  30      I.k_iso_0 = 1000.0
  31      I.k_iso_steep = 1000.0
  32      I.iso_dslope=4./1000.0
  33      I.iso_slopec=1./1000.0
  34      I.enable_skew_diffusion = 1
  35 
  36      M.enable_hor_friction  = 1; M.a_h = (4*M.degtom)**3*2e-11
  37      M.enable_hor_friction_cos_scaling = 1; M.hor_friction_cosPower=1
  38  
  39      M.enable_implicit_vert_friction = 1
  40      T=self.fortran.tke_module   
  41      T.enable_tke = 1
  42      T.c_k = 0.1
  43      T.c_eps = 0.7
  44      T.alpha_tke = 30.0
  45      T.mxl_min = 1e-8
  46      T.tke_mxl_choice = 2
  47      T.enable_tke_superbee_advection = 1
  48 
  49      E=self.fortran.eke_module   
  50      E.enable_eke = 1
  51      E.eke_k_max  = 1e4
  52      E.eke_c_k    = 0.4
  53      E.eke_c_eps  = 0.5
  54      E.eke_cross  = 2.
  55      E.eke_crhin  = 1.0
  56      E.eke_lmin   = 100.0
  57      E.enable_eke_superbee_advection = 1
  58 
  59      I=self.fortran.idemix_module   
  60      I.enable_idemix = 1
  61      I.enable_idemix_hor_diffusion = 1
  62      I.enable_eke_diss_surfbot = 1
  63      I.eke_diss_surfbot_frac = 0.2 # fraction which goes into bottom
  64      I.enable_idemix_superbee_advection = 1
  65 
  66      M.eq_of_state_type = 5
  67      return
  68 
  69 
  70    def set_grid(self):
  71        M=self.fortran.main_module   
  72        ddz = array([50.,70.,100.,140.,190.,240.,290.,340.,390.,440.,490.,540.,590.,640.,690.])
  73        M.dzt[:]=ddz[::-1]
  74        M.dxt[:] = 4.0
  75        M.dyt[:] = 4.0
  76        M.y_origin = -76.0
  77        M.x_origin = 4.0
  78        return
  79 
  80 
  81    def set_coriolis(self):
  82        M=self.fortran.main_module   
  83        for j in range( M.yt.shape[0] ): M.coriolis_t[:,j] = 2*M.omega*sin(M.yt[j]/180.*pi)
  84        return
  85 
  86    def set_topography(self):
  87          """ setup topography
  88          """
  89          M=self.fortran.main_module   
  90          M.kbot[:]=0
  91          bathy = reshape( fromfile('bathymetry.bin', dtype='>i'), (M.nx,M.ny), order='F' )
  92          lev_s = reshape( fromfile('lev_s.bin', dtype='>f', count=M.nx*M.ny*M.nz), (M.nx,M.ny,M.nz), order='F' )[:,:,::-1]
  93          for j in range(M.js_pe,M.je_pe+1):
  94            for i in range(M.is_pe,M.ie_pe+1):
  95               (ii,jj) = ( self.if2py(i), self.jf2py(j) )
  96               for k in range(M.nz-1,-1,-1): 
  97                   if lev_s[i-1,j-1,k] > 0.0: M.kbot[ii,jj]=k+1
  98               if bathy[i-1,j-1] == 0.0: M.kbot[ii,jj] =0
  99          M.kbot[ M.kbot == M.nz] = 0
 100          return
 101    
 102    def set_initial_conditions(self):
 103        """ setup initial conditions
 104        """
 105        M=self.fortran.main_module   
 106 
 107        self.taux = zeros( (M.i_blk+2*M.onx,M.j_blk+2*M.onx,12), 'd', order = 'F')
 108        self.tauy = zeros( (M.i_blk+2*M.onx,M.j_blk+2*M.onx,12), 'd', order = 'F')
 109        self.qnec = zeros( ( M.i_blk+2*M.onx, M.j_blk+2*M.onx, 12 ), 'd' , order = 'F')
 110        self.qnet = zeros( ( M.i_blk+2*M.onx, M.j_blk+2*M.onx, 12 ), 'd' , order = 'F')
 111        self.sst_clim = zeros( ( M.i_blk+2*M.onx, M.j_blk+2*M.onx, 12 ), 'd' , order = 'F')
 112        self.sss_clim = zeros( ( M.i_blk+2*M.onx, M.j_blk+2*M.onx, 12 ), 'd' , order = 'F')
 113        
 114        # initial conditions for T and S
 115        lev = reshape( fromfile('lev_t.bin', dtype='>f', count=M.nx*M.ny*M.nz), (M.nx,M.ny,M.nz), order='F' )
 116        lev = lev[M.is_pe-1:M.ie_pe,M.js_pe-1:M.je_pe,::-1]
 117        M.temp[M.onx:-M.onx,M.onx:-M.onx,:,M.tau-1] = lev*M.maskt[M.onx:-M.onx,M.onx:-M.onx,:]
 118        M.temp[...,M.taum1-1] = M.temp[...,M.tau-1]
 119        
 120        lev = reshape( fromfile('lev_s.bin', dtype='>f', count=M.nx*M.ny*M.nz), (M.nx,M.ny,M.nz), order='F' )
 121        lev = lev[M.is_pe-1:M.ie_pe,M.js_pe-1:M.je_pe,::-1]
 122        M.salt[M.onx:-M.onx,M.onx:-M.onx,:,M.tau-1] = lev*M.maskt[M.onx:-M.onx,M.onx:-M.onx,:]
 123        M.salt[...,M.taum1-1] = M.salt[...,M.tau-1]
 124 
 125        # use Trenberth wind stress from MITgcm instead of ECMWF (also contained in ecmwf_4deg.cdf)
 126        tx = reshape( fromfile('trenberth_taux.bin', dtype='>f'), (M.nx,M.ny,12), order='F' )/M.rho_0
 127        ty = reshape( fromfile('trenberth_tauy.bin', dtype='>f'), (M.nx,M.ny,12), order='F' )/M.rho_0
 128        self.taux[M.onx:-M.onx,M.onx:-M.onx,:] = tx[M.is_pe-1:M.ie_pe,M.js_pe-1:M.je_pe,:]
 129        self.tauy[M.onx:-M.onx,M.onx:-M.onx,:] = ty[M.is_pe-1:M.ie_pe,M.js_pe-1:M.je_pe,:]
 130 
 131        # heat flux 
 132        fid = NF('ecmwf_4deg_monthly.cdf','r')
 133        for k in range(12):
 134            self.qnec[M.onx:-M.onx,M.onx:-M.onx,k] = fid.variables['Q3'][k,M.js_pe-1:M.je_pe,M.is_pe-1:M.ie_pe].transpose()
 135        self.qnec[ self.qnec  <= -1e10 ] = 0.0
 136 
 137        q = reshape( fromfile('ncep_qnet.bin', dtype='>f'), (M.nx,M.ny,12), order='F' )
 138        self.qnet[M.onx:-M.onx,M.onx:-M.onx,:] = - q[M.is_pe-1:M.ie_pe,M.js_pe-1:M.je_pe,:]
 139        self.qnet[ self.qnet  <= -1e10 ] = 0.0
 140 
 141        fxa = zeros( (1,), 'd', order = 'F')
 142        fxb = zeros( (1,), 'd', order = 'F')
 143        for n in range(12):
 144            fxa = fxa + sum( self.qnet[M.onx:-M.onx,M.onx:-M.onx,n]*M.area_t[M.onx:-M.onx,M.onx:-M.onx] )
 145            fxb = fxb + sum( M.area_t[M.onx:-M.onx,M.onx:-M.onx] )
 146        self.fortran.global_sum(fxa)
 147        self.fortran.global_sum(fxb)
 148        fxa = fxa[0]/fxb[0]
 149        if M.my_pe==0: print  ' removing an annual mean heat flux imbalance of %e W/m^2'% fxa
 150        for n in range(12):
 151          self.qnet[:,:,n] = (self.qnet[:,:,n] - fxa)*M.maskt[:,:,-1]
 152 
 153        # SST and SSS
 154        sst = reshape( fromfile('lev_sst.bin', dtype='>f'), (M.nx,M.ny,12), order='F' )
 155        sss = reshape( fromfile('lev_sss.bin', dtype='>f'), (M.nx,M.ny,12), order='F' )
 156        self.sst_clim[M.onx:-M.onx,M.onx:-M.onx,:] = sst[M.is_pe-1:M.ie_pe,M.js_pe-1:M.je_pe,:]
 157        self.sss_clim[M.onx:-M.onx,M.onx:-M.onx,:] = sss[M.is_pe-1:M.ie_pe,M.js_pe-1:M.je_pe,:]
 158 
 159        I=self.fortran.idemix_module   
 160        if I.enable_idemix:
 161          f = reshape( fromfile('tidal_energy.bin', dtype='>f'), (M.nx,M.ny), order='F' )/M.rho_0
 162          I.forc_iw_bottom[ M.onx:-M.onx,M.onx:-M.onx]  = f[M.is_pe-1:M.ie_pe,M.js_pe-1:M.je_pe]
 163          f = reshape( fromfile('wind_energy.bin', dtype='>f'), (M.nx,M.ny), order='F' )/M.rho_0*0.2
 164          I.forc_iw_surface[M.onx:-M.onx,M.onx:-M.onx] = f[M.is_pe-1:M.ie_pe,M.js_pe-1:M.je_pe]
 165        return
 166 
 167    def get_periodic_interval(self,currentTime,cycleLength,recSpacing,nbRec):
 168        """  interpolation routine taken from mitgcm
 169        """
 170        locTime = currentTime - recSpacing*0.5 + cycleLength*( 2 - round(currentTime/cycleLength) )
 171        tmpTime = locTime % cycleLength 
 172        tRec1 = 1 + int( tmpTime/recSpacing )
 173        tRec2 = 1 + tRec1 % int(nbRec) 
 174        wght2 = ( tmpTime - recSpacing*(tRec1 - 1) )/recSpacing
 175        wght1 = 1.0 - wght2
 176        return (wght1,wght2,tRec1,tRec2)
 177    
 178 
 179    def set_forcing(self):
 180      M=self.fortran.main_module   
 181      
 182      (f1,f2,n1,n2) = self.get_periodic_interval((M.itt-1)*M.dt_tracer,365*86400.0,365*86400./12.,12)
 183 
 184      # wind stress
 185      M.surface_taux[:]=(f1*self.taux[:,:,n1-1] + f2*self.taux[:,:,n2-1])
 186      M.surface_tauy[:]=(f1*self.tauy[:,:,n1-1] + f2*self.tauy[:,:,n2-1])
 187 
 188      # tke flux
 189      T=self.fortran.tke_module   
 190      if T.enable_tke:
 191        T.forc_tke_surface[1:-1,1:-1] = sqrt( (0.5*(M.surface_taux[1:-1,1:-1]+M.surface_taux[:-2,1:-1]) )**2  \
 192                                             +(0.5*(M.surface_tauy[1:-1,1:-1]+M.surface_tauy[1:-1,:-2]) )**2 )**(3./2.) 
 193      # heat flux : W/m^2 K kg/J m^3/kg = K m/s 
 194      cp_0 = 3991.86795711963
 195      sst  =  f1*self.sst_clim[:,:,n1-1]+f2*self.sst_clim[:,:,n2-1] 
 196      qnec =  f1*self.qnec[:,:,n1-1]    +f2*self.qnec[:,:,n2-1]
 197      qnet =  f1*self.qnet[:,:,n1-1]    +f2*self.qnet[:,:,n2-1]
 198      M.forc_temp_surface[:] =(qnet+ qnec*(sst-M.temp[:,:,-1,M.tau-1]) )*M.maskt[:,:,-1]/cp_0/M.rho_0
 199 
 200      # salinity restoring
 201      t_rest= 30*86400.0
 202      sss  =  f1*self.sss_clim[:,:,n1-1]+f2*self.sss_clim[:,:,n2-1] 
 203      M.forc_salt_surface[:] =M.dzt[-1]/t_rest*(sss-M.salt[:,:,-1,M.tau-1])*M.maskt[:,:,-1]
 204 
 205      # apply simple ice mask                     
 206      n=nonzero( logical_and( M.temp[:,:,-1,M.tau-1]*M.maskt[:,:,-1] <= -1.8 , M.forc_temp_surface <= 0.0 ) )                            
 207      M.forc_temp_surface[n]=0.0
 208      M.forc_salt_surface[n]=0.0
 209 
 210      if M.enable_tempsalt_sources:
 211         M.temp_source[:] = M.maskt*self.rest_tscl*(f1*self.t_star[:,:,:,n1-1]+f2*self.t_star[:,:,:,n2-1] - M.temp[:,:,:,M.tau-1] )
 212         M.salt_source[:] = M.maskt*self.rest_tscl*(f1*self.s_star[:,:,:,n1-1]+f2*self.s_star[:,:,:,n2-1] - M.salt[:,:,:,M.tau-1] )
 213      return
 214 
 215    def set_diagnostics(self):
 216      M=self.fortran.main_module   
 217      self.register_average(name='temp',long_name='Temperature',         units = 'deg C' , grid = 'TTT', var = M.temp)
 218      self.register_average(name='salt',long_name='Salinity',            units = 'g/kg' ,  grid = 'TTT', var = M.salt)
 219      self.register_average(name='u',   long_name='Zonal velocity',      units = 'm/s' ,   grid = 'UTT', var = M.u)
 220      self.register_average(name='v',   long_name='Meridional velocity', units = 'm/s' ,   grid = 'TUT', var = M.v)
 221      self.register_average(name='w',   long_name='Vertical velocity',   units = 'm/s' ,   grid = 'TTU', var = M.w)
 222      self.register_average(name='taux',long_name='wind stress',         units = 'm^2/s' , grid = 'UT',  var = M.surface_taux)
 223      self.register_average(name='tauy',long_name='wind stress',         units = 'm^2/s' , grid = 'TU',  var = M.surface_tauy)
 224      self.register_average(name='psi' ,long_name='Streamfunction',      units = 'm^3/s' , grid = 'UU',  var = M.psi)
 225      return
 226 
 227 
 228    def user_defined_signal(self):
 229        """ this routine must be called by all processors
 230        """
 231        M=self.fortran.main_module  
 232        a = zeros( (M.nx,M.ny), 'd', order = 'F')
 233        a[M.is_pe-1:M.ie_pe,0] = M.xt[2:-2]
 234        self.fortran.pe0_recv_2d(a)
 235        self.xt_gl = a[:,0].copy()
 236        
 237        a[0,M.js_pe-1:M.je_pe] = M.yt[2:-2]
 238        self.fortran.pe0_recv_2d(a)
 239        self.yt_gl = a[0,:].copy()
 240        
 241        self.psi_gl = zeros( (M.nx,M.ny), 'd', order = 'F')
 242        self.psi_gl[M.is_pe-1:M.ie_pe,M.js_pe-1:M.je_pe] = where( M.maskz[2:-2,2:-2,-1] >0,  M.psi[2:-2,2:-2,M.tau-1] , NaN) 
 243        self.fortran.pe0_recv_2d(self.psi_gl)
 244        
 245        self.temp_gl = zeros( (M.nx,M.ny,M.nz), 'd', order = 'F')
 246        for k in range(M.nz):
 247          a[M.is_pe-1:M.ie_pe,M.js_pe-1:M.je_pe] = where( M.maskt[2:-2,2:-2,k] >0,  M.temp[2:-2,2:-2,k,M.tau-1] , NaN) 
 248          self.fortran.pe0_recv_2d(a)
 249          self.temp_gl[:,:,k]=a.copy()
 250 
 251        self.salt_gl = zeros( (M.nx,M.ny,M.nz), 'd', order = 'F')
 252        for k in range(M.nz):
 253          a[M.is_pe-1:M.ie_pe,M.js_pe-1:M.je_pe] = where( M.maskt[2:-2,2:-2,k] >0,  M.salt[2:-2,2:-2,k,M.tau-1] , NaN) 
 254          self.fortran.pe0_recv_2d(a)
 255          self.salt_gl[:,:,k]=a.copy()
 256 
 257        #self.kappa_gl = zeros( (M.nx,M.ny,M.nz), 'd', order = 'F')
 258        #for k in range(M.nz):
 259        #  a[M.is_pe-1:M.ie_pe,M.js_pe-1:M.je_pe] = where( M.maskw[2:-2,2:-2,k] >0,  M.kappah[2:-2,2:-2,k] , NaN) 
 260        #  self.fortran.pe0_recv_2d(a)
 261        #  self.kappa_gl[:,:,k]=a.copy()
 262 
 263        return
 264 
 265  
 266 
 267    def make_plot(self):
 268        M=self.fortran.main_module         # fortran module with model variables
 269        self.figure.clf()
 270        
 271        self.set_signal('user_defined') # following routine is called by all PEs
 272        self.user_defined_signal()
 273        
 274        ax=self.figure.add_subplot(221)
 275        co=ax.contourf(self.xt_gl,self.yt_gl,self.psi_gl.transpose()*1e-6)
 276        self.figure.colorbar(co)
 277        ax.set_title('Streamfunction [Sv]')
 278        #ax.set_xlabel('Longitude [deg E]')
 279        ax.set_ylabel('Latitude [deg N]')
 280        ax.axis('tight')
 281        
 282        ax=self.figure.add_subplot(222)
 283        co=ax.contourf(self.xt_gl,self.yt_gl,self.temp_gl[:,:,-1].transpose())
 284        self.figure.colorbar(co)
 285        ax.set_title('Sea Surface Temperature [deg C]')
 286        #ax.set_xlabel('Longitude [deg E]')
 287        ax.set_ylabel('Latitude [deg N]')
 288        ax.axis('tight')
 289        
 290        ax=self.figure.add_subplot(223)
 291        co=ax.contourf(self.yt_gl,M.zt,self.temp_gl[M.nx/2-1,:,:].transpose())
 292        self.figure.colorbar(co)
 293        ax.set_title('Temperature [deg C]')
 294        ax.set_ylabel('z [m]')
 295        ax.axis('tight')
 296        
 297        ax=self.figure.add_subplot(224)
 298        co=ax.contourf(self.yt_gl,M.zt,self.salt_gl[M.nx/2-1,:,:].transpose())
 299        self.figure.colorbar(co)
 300        ax.set_title('Salinity [g/kg]')
 301        ax.set_ylabel('z [m]')
 302        ax.axis('tight')
 303        
 304        #ax=self.figure.add_subplot(224)
 305        #try:
 306        # co=ax.contourf(self.yt_gl,M.zw,log10(self.kappa_gl[M.nx/2-1,:,:].transpose()) )
 307        #except:
 308        # pass
 309        #self.figure.colorbar(co)
 310        #ax.set_title('Diffusivity')
 311        #ax.set_xlabel('Latitude [deg N]')
 312        #ax.set_ylabel('z [m]')
 313        #ax.axis('tight')
 314 
 315        
 316        return
 317 
 318 if __name__ == "__main__": global_4deg().run(snapint= 86400.0*25, runlen = 86400.*365*10)

Attached Files

To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.
  • [get | view] (2014-09-13 13:06:30, 14.1 KB) [[attachment:bathymetry.bin]]
  • [get | view] (2014-09-13 13:07:15, 847.6 KB) [[attachment:ecmwf_4deg_monthly.cdf]]
  • [get | view] (2014-09-13 13:08:38, 2531.2 KB) [[attachment:lev_s.bin]]
  • [get | view] (2014-09-13 13:11:09, 168.8 KB) [[attachment:lev_sss.bin]]
  • [get | view] (2014-09-13 13:13:01, 168.8 KB) [[attachment:lev_sst.bin]]
  • [get | view] (2014-09-13 13:10:42, 2531.2 KB) [[attachment:lev_t.bin]]
  • [get | view] (2014-09-13 13:13:43, 168.8 KB) [[attachment:ncep_qnet.bin]]
  • [get | view] (2014-09-13 13:05:16, 13.0 KB) [[attachment:setup1.f90]]
  • [get | view] (2014-09-13 13:05:46, 13.0 KB) [[attachment:setup1.py]]
  • [get | view] (2014-09-13 13:04:41, 88.7 KB) [[attachment:snapshot1.png]]
  • [get | view] (2014-09-13 13:14:09, 14.1 KB) [[attachment:tidal_energy.bin]]
  • [get | view] (2014-09-13 13:14:31, 168.8 KB) [[attachment:trenberth_taux.bin]]
  • [get | view] (2014-09-13 13:15:09, 168.8 KB) [[attachment:trenberth_tauy.bin]]
  • [get | view] (2014-09-13 13:15:21, 14.1 KB) [[attachment:wind_energy.bin]]
 All files | Selected Files: delete move to page copy to page

You are not allowed to attach a file to this page.