Hi all,
I have a problem to simulate a simple tidal basin case. I made a simple rectangular domain (100 km in x-direction by 10 km in y-direction, and the grid spacing is 1 km by 1km). I put the tide at the eastern boundary. I tried both using 'ana_grid.h' and 'ocean_grd.nc', and both worked fine. However, when I put masking at the 'ocean_grd.nc', ROMS worked but with wrong results. When I looked at the result, ROMS made all grid cells to lands, but I didn't created 'ocean_grd.nc' like that. My method worked fine with ROMS3.0, but not with current version. I modified 'grd_spherical_cdl', which comes with ROMS, and created 'ocean_grd.nc'. When I modified, I deleted some variables (hraw, lat_rho, lon_rho, lat_psi, lon_psi, lat_u, lon_u, lat_v, lon_v, rdrag, rdrag2, ZoBot), which I thought I didn't need the values. This method worked fine with old version but not with new version. Below is my CDL file. Please tell me what I am wrong. The result showed that all domain was changed to land. Please help me.
Thanks,
Lee
netcdf ocean_grd {
dimensions:
xi_psi = 101 ;
xi_rho = 102 ;
xi_u = 101 ;
xi_v = 102 ;
eta_psi = 11 ;
eta_rho = 12 ;
eta_u = 12 ;
eta_v = 11 ;
bath = UNLIMITED ; // (0 currently)
variables:
int spherical ;
spherical:long_name = "grid type logical switch" ;
spherical:flag_values = "0, 1" ;
spherical:flag_meanings = "Cartesian spherical" ;
double xl ;
xl:long_name = "domain length in the XI-direction" ;
xl:units = "meter" ;
double el ;
el:long_name = "domain length in the ETA-direction" ;
el:units = "meter" ;
double h(eta_rho, xi_rho) ;
h:long_name = "Final bathymetry at RHO-points" ;
h:units = "meter" ;
h:coordinates = "lon_rho lat_rho" ;
double f(eta_rho, xi_rho) ;
f:long_name = "Coriolis parameter at RHO-points" ;
f:units = "second-1" ;
f:coordinates = "lon_rho lat_rho" ;
double pm(eta_rho, xi_rho) ;
pm:long_name = "curvilinear coordinate metric in XI" ;
pm:units = "meter-1" ;
pm:coordinates = "lon_rho lat_rho" ;
double pn(eta_rho, xi_rho) ;
pn:long_name = "curvilinear coordinate metric in ETA" ;
pn:units = "meter-1" ;
pn:coordinates = "lon_rho lat_rho" ;
double dndx(eta_rho, xi_rho) ;
dndx:long_name = "xi derivative of inverse metric factor pn" ;
dndx:units = "meter" ;
dndx:coordinates = "lon_rho lat_rho" ;
double dmde(eta_rho, xi_rho) ;
dmde:long_name = "eta derivative of inverse metric factor pm" ;
dmde:units = "meter" ;
dmde:coordinates = "lon_rho lat_rho" ;
double x_rho(eta_rho, xi_rho) ;
x_rho:long_name = "x location of RHO-points" ;
x_rho:units = "meter" ;
double y_rho(eta_rho, xi_rho) ;
y_rho:long_name = "y location of RHO-points" ;
y_rho:units = "meter" ;
double x_psi(eta_psi, xi_psi) ;
x_psi:long_name = "x location of PSI-points" ;
x_psi:units = "meter" ;
double y_psi(eta_psi, xi_psi) ;
y_psi:long_name = "y location of PSI-points" ;
y_psi:units = "meter" ;
double x_u(eta_u, xi_u) ;
x_u:long_name = "x location of U-points" ;
x_u:units = "meter" ;
double y_u(eta_u, xi_u) ;
y_u:long_name = "y location of U-points" ;
y_u:units = "meter" ;
double x_v(eta_v, xi_v) ;
x_v:long_name = "x location of V-points" ;
x_v:units = "meter" ;
double y_v(eta_v, xi_v) ;
y_v:long_name = "y location of V-points" ;
y_v:units = "meter" ;
double angle(eta_rho, xi_rho) ;
angle:long_name = "angle between XI-axis and EAST" ;
angle:units = "radians" ;
angle:coordinates = "lon_rho lat_rho" ;
double mask_rho(eta_rho, xi_rho) ;
mask_rho:long_name = "mask on RHO-points" ;
mask_rho:flag_values = 0., 1. ;
mask_rho:flag_meanings = "land water" ;
mask_rho:coordinates = "lon_rho lat_rho" ;
double mask_u(eta_u, xi_u) ;
mask_u:long_name = "mask on U-points" ;
mask_u:flag_values = 0., 1. ;
mask_u:flag_meanings = "land water" ;
mask_u:coordinates = "lon_u lat_u" ;
double mask_v(eta_v, xi_v) ;
mask_v:long_name = "mask on V-points" ;
mask_v:flag_values = 0., 1. ;
mask_v:flag_meanings = "land water" ;
mask_v:coordinates = "lon_v lat_v" ;
double mask_psi(eta_psi, xi_psi) ;
mask_psi:long_name = "mask on PSI-points" ;
mask_psi:flag_values = 0., 1. ;
mask_psi:flag_meanings = "land water" ;
mask_psi:coordinates = "lon_rho lat_rho" ;
// global attributes:
:type = "ROMS GRID file" ;
:title = "NJB grid for LEO-15" ;
}
Problem with 'ocean_grd.nc'
Re: Problem with 'ocean_grd.nc'
You can create a file with ncgen to get the correct variables and dimensions. How did you specify where you wanted your land mask? Did you have the full array of ones and zeros in the CDL file? Many, many scripting languages have a NetCDF interface which can be used to set the values or you can use the matlab/python mask editing features. If ana_grid.h is working for you, you can also try ana_mask.h.
Re: Problem with 'ocean_grd.nc'
Hi Kate,kate wrote:You can create a file with ncgen to get the correct variables and dimensions. How did you specify where you wanted your land mask? Did you have the full array of ones and zeros in the CDL file? Many, many scripting languages have a NetCDF interface which can be used to set the values or you can use the matlab/python mask editing features. If ana_grid.h is working for you, you can also try ana_mask.h.
I created 'ocean_grd.nc' file using 'ncgen -b grd_spherical.cdl'. And I deleted some variables, which I though I didn't use for my grid. I am sure it worked fine for old version of ROMS, but not with current version. Oh, I am using matlab to fill the values. When I look at the results, the it masked all the domain, and the zeta values showed 1.0*10^23 values. After fill the values using matlab, I always re-check the values using ncload. It looks fine, but... result file doesn't look what I created.
Lee
Re: Problem with 'ocean_grd.nc'
Hi Kate,kate wrote:You can create a file with ncgen to get the correct variables and dimensions. How did you specify where you wanted your land mask? Did you have the full array of ones and zeros in the CDL file? Many, many scripting languages have a NetCDF interface which can be used to set the values or you can use the matlab/python mask editing features. If ana_grid.h is working for you, you can also try ana_mask.h.
When you want to change variables in 'ocean_grd.nc', what method do you usually use? In my case, I use meccdf tool box for matlab. First, I load the values using 'ncload' command in matlab. And then, I changed the values such as h and mask_rho. Then, I save the values using 'ncsave'. It worked fine, but all of sudden it didn't. Do you use other method?
Thanks,
Lee
Re: Problem with 'ocean_grd.nc'
For messing with NetCDF files I use NCL and/or Python. I was hoping someone else would help you with the Matlab if that's the road you want to take.
Re: Problem with 'ocean_grd.nc'
Thanks Kate. I think it is the time to learn Phthon. Thanks anyway.kate wrote:For messing with NetCDF files I use NCL and/or Python. I was hoping someone else would help you with the Matlab if that's the road you want to take.
Lee
- arango
- Site Admin
- Posts: 1363
- Joined: Wed Feb 26, 2003 4:41 pm
- Location: DMCS, Rutgers University
- Contact:
Re: Problem with 'ocean_grd.nc'
You can use the script matlab/grid/c_grid.m to create an empty ROMS grid NetCDF file:
> status=c_grid(Lp, Mp, 'my_grid.nc', true)
where Lp=L+1=Lm+2 and Mp=M+1+Mm+2. That is, Lp and Mp are the total number of points in the I- and J-directions (0:L, 0:M). Once that the file is created, you can use the NetCDF interface to Matlab (see matlab/utility/nc_write.m) to write the values of the grid variables to the desired values.
It is that simple! All these Matlab scripts are located in ROMS repository which you can download using:
svn checkout https://www.myroms.org/svn/src/matlab MyDir
I don't understand why are you deleting variable from the CDL script. All these variables are used in one form or another. Believe me, if we won't use such variables, I will be the first one deleting them from the repository files.
I seems to me that you need to master how to manipulate NetCDF files. This is going to make your life easier when configuring ROMS...
> status=c_grid(Lp, Mp, 'my_grid.nc', true)
where Lp=L+1=Lm+2 and Mp=M+1+Mm+2. That is, Lp and Mp are the total number of points in the I- and J-directions (0:L, 0:M). Once that the file is created, you can use the NetCDF interface to Matlab (see matlab/utility/nc_write.m) to write the values of the grid variables to the desired values.
It is that simple! All these Matlab scripts are located in ROMS repository which you can download using:
svn checkout https://www.myroms.org/svn/src/matlab MyDir
I don't understand why are you deleting variable from the CDL script. All these variables are used in one form or another. Believe me, if we won't use such variables, I will be the first one deleting them from the repository files.
I seems to me that you need to master how to manipulate NetCDF files. This is going to make your life easier when configuring ROMS...
Re: Problem with 'ocean_grd.nc'
Oh! I will try that. Thanks for the help!arango wrote:You can use the script matlab/grid/c_grid.m to create an empty ROMS grid NetCDF file:
> status=c_grid(Lp, Mp, 'my_grid.nc', true)
where Lp=L+1=Lm+2 and Mp=M+1+Mm+2. That is, Lp and Mp are the total number of points in the I- and J-directions (0:L, 0:M). Once that the file is created, you can use the NetCDF interface to Matlab (see matlab/utility/nc_write.m) to write the values of the grid variables to the desired values.
It is that simple! All these Matlab scripts are located in ROMS repository which you can download using:
svn checkout https://www.myroms.org/svn/src/matlab MyDir
I don't understand why are you deleting variable from the CDL script. All these variables are used in one form or another. Believe me, if we won't use such variables, I will be the first one deleting them from the repository files.
I seems to me that you need to master how to manipulate NetCDF files. This is going to make your life easier when configuring ROMS...
Thanks,
Lee