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 flame_E7(pyOM):
  10    """ the 4/3 FLAME Atlantic model
  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)   = (87,89,45)
  18      M.dt_mom    = 3600.0
  19      M.dt_tracer = 3600.0
  20 
  21      M.runlen = 86400*365.0
  22      
  23      M.coord_degree     = 1
  24 
  25      M.congr_epsilon = 1e-6
  26      M.congr_max_iterations = 20000
  27      M.enable_streamfunction = 1
  28 
  29      I=self.fortran.isoneutral_module   
  30      I.enable_neutral_diffusion = 1
  31      I.enable_skew_diffusion = 1
  32      I.k_iso_0 = 1000.0
  33      I.k_iso_steep = 200.0
  34      I.iso_dslope = 1./1000.0
  35      I.iso_slopec = 4./1000.0
  36 
  37      M.enable_hor_friction = 1
  38      M.a_h = 5e4 
  39      M.enable_hor_friction_cos_scaling = 1
  40      M.hor_friction_cosPower = 3
  41      M.enable_tempsalt_sources = 1
  42 
  43      M.enable_implicit_vert_friction = 1
  44      T=self.fortran.tke_module   
  45      T.enable_tke = 1
  46      T.c_k = 0.1
  47      T.c_eps = 0.7
  48      T.alpha_tke = 30.0
  49      T.mxl_min = 1e-8
  50      T.tke_mxl_choice = 2
  51 
  52      M.k_gm_0 = 1000.0
  53      #E=self.fortran.eke_module   
  54      #E.enable_eke = 1
  55 
  56      I=self.fortran.idemix_module   
  57      I.enable_idemix = 1
  58      I.enable_idemix_hor_diffusion = 1
  59 
  60      M.eq_of_state_type = 5
  61      return
  62 
  63 
  64    def set_grid(self):
  65        M=self.fortran.main_module   
  66        fid = NF('forcing.cdf','r')
  67        (i1,i2) = ( self.if2py(M.is_pe), self.if2py(M.ie_pe) )
  68        M.dxt[i1:i2+1] = fid.variables['dxtdeg'][M.is_pe-1:M.ie_pe]
  69        (j1,j2) = ( self.jf2py(M.js_pe), self.jf2py(M.je_pe) )
  70        M.dyt[j1:j2+1] = fid.variables['dytdeg'][M.js_pe-1:M.je_pe] 
  71        M.dzt[:] = fid.variables['dzt'][::-1] /100.0
  72        M.x_origin = fid.variables['xu'][0]
  73        M.y_origin = fid.variables['yu'][0]
  74        return
  75 
  76 
  77    def set_coriolis(self):
  78      M=self.fortran.main_module
  79      for j in range( M.yt.shape[0] ): M.coriolis_t[:,j] = 2*M.omega*sin(M.yt[j]/180.*pi)
  80      return
  81 
  82    def set_topography(self):
  83        """ setup topography
  84        """
  85        M=self.fortran.main_module   
  86        fid = NF('forcing.cdf','r')
  87        kmt = fid.variables['kmt'][:]
  88        M.kbot[:]=1
  89        for j in range(M.js_pe,M.je_pe+1):
  90          for i in range(M.is_pe,M.ie_pe+1):
  91            (ii,jj) = ( self.if2py(i), self.jf2py(j) )
  92            M.kbot[ii,jj]=min(M.nz,M.nz-kmt[j-1,i-1]+1)
  93            if  kmt[j-1,i-1] == 0: M.kbot[ii,jj] =0
  94        return
  95    
  96    def set_initial_conditions(self):
  97        """ setup initial conditions
  98        """
  99        M=self.fortran.main_module   
 100        fid = NF('forcing.cdf','r')
 101        
 102        # initial conditions
 103        t = fid.variables['temp_ic'][::-1,M.js_pe-1:M.je_pe,M.is_pe-1:M.ie_pe]
 104        s = fid.variables['salt_ic'][::-1,M.js_pe-1:M.je_pe,M.is_pe-1:M.ie_pe]
 105        for k in range(M.nz):
 106           M.temp[ self.if2py(M.is_pe):self.if2py(M.ie_pe)+1, self.jf2py(M.js_pe):self.jf2py(M.je_pe)+1, k,M.tau-1] = t[k,:,:].transpose()
 107           M.salt[ self.if2py(M.is_pe):self.if2py(M.ie_pe)+1, self.jf2py(M.js_pe):self.jf2py(M.je_pe)+1, k,M.tau-1] = s[k,:,:].transpose()*1000+35.0
 108        for d in (M.temp,M.salt):
 109            d[...,M.tau-1] = d[...,M.tau-1]*M.maskt
 110            d[...,M.taum1-1] = d[...,M.tau-1]
 111 
 112        # wind stress
 113        self.tx = zeros( ( M.i_blk+2*M.onx, M.j_blk+2*M.onx, 12 ), 'd' , order = 'F')
 114        self.ty = zeros( ( M.i_blk+2*M.onx, M.j_blk+2*M.onx, 12 ), 'd' , order = 'F')
 115        for k in range(12):
 116            self.tx[2:-2,2:-2,k] = fid.variables['taux'][k,M.js_pe-1:M.je_pe,M.is_pe-1:M.ie_pe].transpose()/10. /M.rho_0
 117            self.ty[2:-2,2:-2,k] = fid.variables['tauy'][k,M.js_pe-1:M.je_pe,M.is_pe-1:M.ie_pe].transpose()/10. /M.rho_0
 118        # zero out masks and do boundary exchange
 119        for d in (self.tx, self.ty) :
 120          d[ d <= -1e10 ] = 0.0
 121          for k in range(12):
 122            self.fortran.border_exchg_xy(M.is_pe-M.onx,M.ie_pe+M.onx,M.js_pe-M.onx,M.je_pe+M.onx,d[:,:,k]) 
 123            self.fortran.setcyclic_xy   (M.is_pe-M.onx,M.ie_pe+M.onx,M.js_pe-M.onx,M.je_pe+M.onx,d[:,:,k])
 124        
 125        # interpolate from B grid location to C grid
 126        for k in range(12):
 127            self.tx[:,1:,k] = (self.tx[:,:-1,k] + self.tx[:,1:,k])/(M.maskz[:,:-1,-1]+M.maskz[:,1:,-1]+1e-20)
 128            self.ty[1:,:,k] = (self.ty[:-1,:,k] + self.ty[1:,:,k])/(M.maskz[:-1,:,-1]+M.maskz[1:,:,-1]+1e-20)
 129            self.tx[:,:,k] = self.tx[:,:,k]*M.masku[:,:,-1]
 130            self.ty[:,:,k] = self.ty[:,:,k]*M.maskv[:,:,-1]
 131 
 132        # heat flux and salinity restoring
 133        self.sst_clim = zeros( ( M.i_blk+2*M.onx, M.j_blk+2*M.onx, 12 ), 'd' , order = 'F')
 134        self.sss_clim = zeros( ( M.i_blk+2*M.onx, M.j_blk+2*M.onx, 12 ), 'd' , order = 'F')
 135        self.sst_rest = zeros( ( M.i_blk+2*M.onx, M.j_blk+2*M.onx, 12 ), 'd' , order = 'F')
 136        self.sss_rest = zeros( ( M.i_blk+2*M.onx, M.j_blk+2*M.onx, 12 ), 'd' , order = 'F')
 137        for k in range(12):
 138            self.sst_clim[2:-2,2:-2,k] = fid.variables['sst_clim'][k,M.js_pe-1:M.je_pe,M.is_pe-1:M.ie_pe].transpose()
 139            self.sss_clim[2:-2,2:-2,k] = fid.variables['sss_clim'][k,M.js_pe-1:M.je_pe,M.is_pe-1:M.ie_pe].transpose()*1000+35
 140            self.sst_rest[2:-2,2:-2,k] = fid.variables['sst_rest'][k,M.js_pe-1:M.je_pe,M.is_pe-1:M.ie_pe].transpose()*41868.
 141            self.sss_rest[2:-2,2:-2,k] = fid.variables['sss_rest'][k,M.js_pe-1:M.je_pe,M.is_pe-1:M.ie_pe].transpose()/100.0
 142        for d in (self.sst_clim, self.sss_clim, self.sst_rest, self.sss_rest): d[ d  <= -1e10 ] = 0.0
 143 
 144        # sponge layers
 145        self.t_star    = zeros( ( M.i_blk+2*M.onx, M.j_blk+2*M.onx, M.nz, 12 ), 'd' , order = 'F')
 146        self.s_star    = zeros( ( M.i_blk+2*M.onx, M.j_blk+2*M.onx, M.nz, 12 ), 'd' , order = 'F')
 147        self.rest_tscl = zeros( ( M.i_blk+2*M.onx, M.j_blk+2*M.onx, M.nz ), 'd' , order = 'F')
 148        fid = NF('restoring_zone.cdf','r')
 149        (i1,j1) = ( self.if2py(M.is_pe  ), self.jf2py(M.js_pe) )
 150        (i2,j2) = ( self.if2py(M.ie_pe+1), self.jf2py(M.je_pe+1) )
 151        for k in range(M.nz):
 152          self.rest_tscl[i1:i2,j1:j2,k] = fid.variables['tscl'][0,k,M.js_pe-1:M.je_pe,M.is_pe-1:M.ie_pe].transpose()
 153        for n in range(12):
 154          for k in range(M.nz):
 155            self.t_star[i1:i2,j1:j2,k,n] = fid.variables['t_star'][n,k,M.js_pe-1:M.je_pe,M.is_pe-1:M.ie_pe].transpose()
 156            self.s_star[i1:i2,j1:j2,k,n] = fid.variables['s_star'][n,k,M.js_pe-1:M.je_pe,M.is_pe-1:M.ie_pe].transpose()
 157 
 158        I=self.fortran.idemix_module   
 159        if I.enable_idemix:
 160          f = reshape( fromfile('tidal_energy.bin', dtype='>f'), (M.nx,M.ny), order='F' )/M.rho_0
 161          I.forc_iw_bottom[2:-2,2:-2]  = f[M.is_pe-1:M.ie_pe,M.js_pe-1:M.je_pe]
 162          f = reshape( fromfile('wind_energy.bin', dtype='>f'), (M.nx,M.ny), order='F' )/M.rho_0*0.2
 163          I.forc_iw_surface[2:-2,2:-2] = f[M.is_pe-1:M.ie_pe,M.js_pe-1:M.je_pe]
 164        return
 165 
 166    def get_periodic_interval(self,currentTime,cycleLength,recSpacing,nbRec):
 167        """  interpolation routine taken from mitgcm
 168        """
 169        locTime = currentTime - recSpacing*0.5 + cycleLength*( 2 - round(currentTime/cycleLength) )
 170        tmpTime = locTime % cycleLength 
 171        tRec1 = 1 + int( tmpTime/recSpacing )
 172        tRec2 = 1 + tRec1 % int(nbRec) 
 173        wght2 = ( tmpTime - recSpacing*(tRec1 - 1) )/recSpacing
 174        wght1 = 1.0 - wght2
 175        return (wght1,wght2,tRec1,tRec2)
 176    
 177 
 178    def set_forcing(self):
 179      M=self.fortran.main_module   
 180      fxa = 365*86400.0
 181      (f1,f2,n1,n2) = self.get_periodic_interval((M.itt-1)*M.dt_tracer,fxa,fxa/12.,12)
 182      
 183      M.surface_taux[:]=(f1*self.tx[:,:,n1-1] + f2*self.tx[:,:,n2-1])
 184      M.surface_tauy[:]=(f1*self.ty[:,:,n1-1] + f2*self.ty[:,:,n2-1])
 185 
 186      T=self.fortran.tke_module   
 187      if T.enable_tke:
 188        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  \
 189                                             +(0.5*(M.surface_tauy[1:-1,1:-1]+M.surface_tauy[1:-1,:-2]) )**2 )**(3./2.) 
 190      cp_0 = 3991.86795711963
 191      M.forc_temp_surface[:]=(f1*self.sst_rest[:,:,n1-1]+f2*self.sst_rest[:,:,n2-1])* \
 192                             (f1*self.sst_clim[:,:,n1-1]+f2*self.sst_clim[:,:,n2-1]-M.temp[:,:,-1,M.tau-1])*M.maskt[:,:,-1]/cp_0/M.rho_0
 193      M.forc_salt_surface[:]=(f1*self.sss_rest[:,:,n1-1]+f2*self.sss_rest[:,:,n2-1])* \
 194                             (f1*self.sss_clim[:,:,n1-1]+f2*self.sss_clim[:,:,n2-1]-M.salt[:,:,-1,M.tau-1])*M.maskt[:,:,-1]
 195      # apply simple ice mask                     
 196      n=nonzero( logical_and( M.temp[:,:,-1,M.tau-1]*M.maskt[:,:,-1] <= -1.8 , M.forc_temp_surface <= 0.0 ) )                            
 197      M.forc_temp_surface[n]=0.0
 198      M.forc_salt_surface[n]=0.0
 199 
 200      if M.enable_tempsalt_sources:
 201         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] )
 202         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] )
 203      return
 204 
 205    def set_diagnostics(self):
 206      M=self.fortran.main_module   
 207      self.register_average(name='temp',long_name='Temperature',         units = 'deg C' , grid = 'TTT', var = M.temp)
 208      self.register_average(name='salt',long_name='Salinity',            units = 'g/kg' ,  grid = 'TTT', var = M.salt)
 209      self.register_average(name='u',   long_name='Zonal velocity',      units = 'm/s' ,   grid = 'UTT', var = M.u)
 210      self.register_average(name='v',   long_name='Meridional velocity', units = 'm/s' ,   grid = 'TUT', var = M.v)
 211      self.register_average(name='w',   long_name='Vertical velocity',   units = 'm/s' ,   grid = 'TTU', var = M.w)
 212      self.register_average(name='taux',long_name='wind stress',         units = 'm^2/s' , grid = 'UT',  var = M.surface_taux)
 213      self.register_average(name='tauy',long_name='wind stress',         units = 'm^2/s' , grid = 'TU',  var = M.surface_tauy)
 214      self.register_average(name='psi' ,long_name='Streamfunction',      units = 'm^3/s' , grid = 'UU',  var = M.psi)
 215      return
 216 
 217 
 218    def user_defined_signal(self):
 219        """ this routine must be called by all processors
 220        """
 221        M=self.fortran.main_module  
 222        a = zeros( (M.nx,M.ny), 'd', order = 'F')
 223        a[M.is_pe-1:M.ie_pe,0] = M.xt[2:-2]
 224        self.fortran.pe0_recv_2d(a)
 225        self.xt_gl = a[:,0].copy()
 226        
 227        a[0,M.js_pe-1:M.je_pe] = M.yt[2:-2]
 228        self.fortran.pe0_recv_2d(a)
 229        self.yt_gl = a[0,:].copy()
 230        
 231        self.psi_gl = zeros( (M.nx,M.ny), 'd', order = 'F')
 232        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) 
 233        self.fortran.pe0_recv_2d(self.psi_gl)
 234        
 235        self.temp_gl = zeros( (M.nx,M.ny,M.nz), 'd', order = 'F')
 236        for k in range(M.nz):
 237          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) 
 238          self.fortran.pe0_recv_2d(a)
 239          self.temp_gl[:,:,k]=a.copy()
 240 
 241        self.salt_gl = zeros( (M.nx,M.ny,M.nz), 'd', order = 'F')
 242        for k in range(M.nz):
 243          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) 
 244          self.fortran.pe0_recv_2d(a)
 245          self.salt_gl[:,:,k]=a.copy()
 246 
 247        #self.kappa_gl = zeros( (M.nx,M.ny,M.nz), 'd', order = 'F')
 248        #for k in range(M.nz):
 249        #  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) 
 250        #  self.fortran.pe0_recv_2d(a)
 251        #  self.kappa_gl[:,:,k]=a.copy()
 252 
 253        return
 254 
 255 
 256    def make_plot(self):
 257        M=self.fortran.main_module         # fortran module with model variables
 258        self.figure.clf()
 259        
 260        self.set_signal('user_defined') # following routine is called by all PEs
 261        self.user_defined_signal()
 262        
 263        ax=self.figure.add_subplot(221)
 264        co=ax.contourf(self.yt_gl,M.zt,self.temp_gl[M.nx/2-1,:,:].transpose())
 265        self.figure.colorbar(co)
 266        ax.set_title('Temperature [deg C]')
 267        ax.set_ylabel('z [m]')
 268        ax.axis('tight')
 269 
 270        ax=self.figure.add_subplot(223)
 271        co=ax.contourf(self.yt_gl,M.zt,self.salt_gl[M.nx/2-1,:,:].transpose())
 272        self.figure.colorbar(co)
 273        ax.set_title('Salinity [g/kg]')
 274        ax.set_ylabel('z [m]')
 275        ax.axis('tight')
 276 
 277        #ax=self.figure.add_subplot(223)
 278        #try:
 279        # co=ax.contourf(self.yt_gl,M.zw,log10(self.kappa_gl[M.nx/2-1,:,:].transpose()) )
 280        #except:
 281        # pass
 282        #self.figure.colorbar(co)
 283        #ax.set_title('Diffusivity')
 284        #ax.set_xlabel('Latitude [deg N]')
 285        #ax.set_ylabel('z [m]')
 286        #ax.axis('tight')
 287 
 288        ax=self.figure.add_subplot(222)
 289        co=ax.contourf(self.xt_gl,self.yt_gl,self.psi_gl.transpose()*1e-6)
 290        self.figure.colorbar(co)
 291        ax.set_title('Streamfunction [Sv]')
 292        #ax.set_xlabel('Longitude [deg E]')
 293        ax.set_ylabel('Latitude [deg N]')
 294        ax.axis('tight')
 295        
 296        ax=self.figure.add_subplot(224)
 297        co=ax.contourf(self.xt_gl,self.yt_gl,self.temp_gl[:,:,-1].transpose())
 298        self.figure.colorbar(co)
 299        ax.set_title('Sea Surface Temperature [deg C]')
 300        #ax.set_xlabel('Longitude [deg E]')
 301        ax.set_ylabel('Latitude [deg N]')
 302        ax.axis('tight')
 303        
 304        return
 305 
 306 if __name__ == "__main__": flame_E7().run(snapint= 86400.0)

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:24:28, 15673.1 KB) [[attachment:forcing.cdf]]
  • [get | view] (2014-09-13 13:49:17, 49000.4 KB) [[attachment:restoring_zone.cdf]]
  • [get | view] (2014-09-13 13:15:47, 15.4 KB) [[attachment:setup1.f90]]
  • [get | view] (2014-09-13 13:47:16, 13.1 KB) [[attachment:setup1.py]]
  • [get | view] (2014-09-13 13:45:12, 94.0 KB) [[attachment:snapshot1.png]]
  • [get | view] (2014-09-13 13:16:35, 30.2 KB) [[attachment:tidal_energy.bin]]
  • [get | view] (2014-09-13 13:16:55, 30.2 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.