diff --git a/geogrid/src/v431/gridinfo_module.F b/geogrid/src/v431/gridinfo_module.F
index b854319218bf2b4da0aa3e1adf2e380f4a785ea0..369d1521a40c835cd368018ae41f205fddf4db2e 100644
--- a/geogrid/src/v431/gridinfo_module.F
+++ b/geogrid/src/v431/gridinfo_module.F
@@ -28,6 +28,10 @@ module gridinfo_module
    logical :: do_tiled_output
    logical, dimension(MAX_DOMAINS) :: grid_is_active
    integer :: debug_level
+! L. Fita, CIMA. January 2020. RegIPSL
+   INTEGER                                               :: minwatersize, Nbndsorogfilt
+   CHARACTER(len=100)                                    :: typebndsorogfilt, bnds_to_filt
+   LOGICAL                                               :: bndsorogfilt
  
    contains
  
@@ -69,7 +73,9 @@ module gridinfo_module
                          i_parent_start, j_parent_start, s_we, e_we, s_sn, e_sn, &
                          map_proj, ref_x, ref_y, ref_lat, ref_lon, &
                          pole_lat, pole_lon, truelat1, truelat2, stand_lon, &
-                         dx, dy, geog_data_res, geog_data_path, opt_geogrid_tbl_path
+                         dx, dy, geog_data_res, geog_data_path, opt_geogrid_tbl_path, &
+! L. Fita, CIMA. January 2020. RegIPSL
+                         minwatersize, bndsorogfilt, bnds_to_filt, Nbndsorogfilt, typebndsorogfilt
   
       ! Set defaults for namelist variables
       debug_level = 0
@@ -119,6 +125,12 @@ module gridinfo_module
       opt_geogrid_tbl_path = 'geogrid/'
       interval_seconds = INVALID
       nocolons = .false.
+! L. Fita, CIMA. January 2020. RegIPSL
+      minwatersize = 500
+      bndsorogfilt = .FALSE.
+      bnds_to_filt = 'all'
+      Nbndsorogfilt = 5
+      typebndsorogfilt = 'incremental'
       
       ! Read parameters from Fortran namelist
       do funit=10,100
@@ -268,6 +280,8 @@ module gridinfo_module
       call mprintf(.true.,LOGFILE,'  STAND_LON         = %f',f1=stand_lon)
       call mprintf(.true.,LOGFILE,'  GEOG_DATA_PATH    = %s',s1=geog_data_path)
       call mprintf(.true.,LOGFILE,'  OPT_GEOGRID_TBL_PATH = %s',s1=opt_geogrid_tbl_path)
+! L. Fita, CIMA. January 2020. RegIPSL
+      call mprintf(.true.,LOGFILE,'  MINWATERSIZE = %i',i1=minwatersize)
       call mprintf(.true.,LOGFILE,'/')
 
       dxkm = dx
diff --git a/geogrid/src/v431/process_tile_module.F b/geogrid/src/v431/process_tile_module.F
index b8f4f6c304a6e4c2cf0567908a3b31ee0a703d0f..2045238df0b2ae5b7afabea6922aec083eb74a4b 100644
--- a/geogrid/src/v431/process_tile_module.F
+++ b/geogrid/src/v431/process_tile_module.F
@@ -61,7 +61,7 @@ module process_tile_module
       integer :: sm1, em1, sm2, em2
       integer :: istagger
       integer, dimension(MAX_LANDMASK_CATEGORIES) :: landmask_value
-      real :: sum, dominant, msg_fill_val, topo_flag_val, mass_flag, land_total, water_total
+      real :: sumv, dominant, msg_fill_val, topo_flag_val, mass_flag, land_total, water_total
       real, dimension(16) :: corner_lats, corner_lons
       real, pointer, dimension(:,:) :: xlat_array,   xlon_array,   &
                                        xlat_array_u, xlon_array_u, &
@@ -734,13 +734,13 @@ module process_tile_module
          ! Find fractions
          do i=start_mem_i, end_mem_i
             do j=start_mem_j, end_mem_j
-               sum = 0.
+               sumv = 0.
                do k=min_category,max_category
-                  sum = sum + field(i,j,k)
+                  sumv = sumv + field(i,j,k)
                end do
-               if (sum > 0.0) then
+               if (sumv > 0.0) then
                   do k=min_category,max_category
-                     field(i,j,k) = field(i,j,k) / sum
+                     field(i,j,k) = field(i,j,k) / sumv
                   end do
                else
                   do k=min_category,max_category
@@ -1515,13 +1515,13 @@ module process_tile_module
                   ! Find fractions
                   do i=sm1, em1
                      do j=sm2, em2
-                        sum = 0.
+                        sumv = 0.
                         do k=min_category,max_category
-                           sum = sum + field(i,j,k)
+                           sumv = sumv + field(i,j,k)
                         end do
-                        if (sum > 0.0) then
+                        if (sumv > 0.0) then
                            do k=min_category,max_category
-                              field(i,j,k) = field(i,j,k) / sum
+                              field(i,j,k) = field(i,j,k) / sumv
                            end do
                         else
                            do k=min_category,max_category
diff --git a/nc2wps/Makefile.irene b/nc2wps/Makefile.irene
new file mode 100644
index 0000000000000000000000000000000000000000..421be654bd36d3294de6d5912d668c895ccf8ed2
--- /dev/null
+++ b/nc2wps/Makefile.irene
@@ -0,0 +1,53 @@
+# Makefile for netcdf2wps tool.
+#   From netcdf to WPS' ungrib output
+#   - Compilation for JeanZay (IDRIS)
+#source $CCCWORKDIR/RegIPSL/regipsl/RegIPSL/modeles/ARCH/irene.def
+#module load netcdf-fortran/4.5.3 mpi/intelmpi/21.4.0
+
+FC = ifort
+F90FLAGS = -FR -convert big_endian
+DEBUG = #-g -O2 -traceback -fp-stack-check -ftrapuv -check bounds
+LOPT                = -lnetcdff -lnetcdf
+#CPPFLAGS            = -D_UNDERSCORE -DBYTESWAP -DLINUX -DIO_NETCDF -DBIT32 -DNO_SIGNAL
+#CPPFLAGS            = -D_UNDERSCORE  -DLINUX -DIO_NETCDF -DIO_BINARY -DIO_GRIB1 -DBIT32 -D_MPI
+#CPPFLAGS            = -D_UNDERSCORE -DBYTESWAP -DLINUX -DIO_NETCDF -DIO_BINARY -DIO_GRIB1 -DBIT32 -D_MPI
+NETCDFLIBS 		= -L/ccc/products/ccc_users_env/compil/Rhel_8__x86_64/netcdf-c-4.6.0/intel--20.0.2__openmpi--4.0.1/hdf5__parallel/lib -L/ccc/products/ccc_users_env/compil/Rhel_8__x86_64/netcdf-fortran-4.4.4/intel--20.0.0__openmpi--4.0.1/hdf5__parallel/lib
+NETCDFINCS		= -I/ccc/products/ccc_users_env/compil/Rhel_8__x86_64/netcdf-fortran-4.4.4/intel--20.0.0__openmpi--4.0.1/hdf5__parallel/include
+FOPT 	= $(NETCDFLIBS) $(NETCDFINCS)
+
+####### ###### ##### #### ### ## #
+
+MODULES = \
+	stringop.o \
+	errioipsl.o \
+	calendar.o \
+	met_data_module.o \
+	module_definitions.o \
+	module_netcdf_utils.o \
+	module_ncwps.o
+
+all : \
+	read_FILE \
+	test \
+	netcdf2wps
+
+clean : 
+	rm read_FILE netcdf2wps *.o *.mod
+
+clean_wrtcode : 
+	rm netcdf2wps module_netcdf_utils.mod module_netcdf_utils.o module_ncwps.o
+
+## Compilation
+
+%.o: %.f90
+	$(FC) -c $(F90FLAGS) $(CPPFLAGS) $(DEBUG) $(FOPT) $(LOPT) -o $@ $<
+
+read_FILE: $(MODULES) 
+	       $(FC) $(F90FLAGS) $(MODULES) $(DEBUG) $(LOPT) $(FOPT) read_FILE.f90 -o read_FILE
+
+test: $(MODULES) 
+	       $(FC) $(F90FLAGS) $(MODULES) $(DEBUG) $(LOPT) $(FOPT) test.f90 -o test
+
+netcdf2wps: $(MODULES) 
+	       $(FC) $(F90FLAGS) $(MODULES) $(DEBUG) $(LOPT) $(FOPT) netcdf2wps.f90 -o netcdf2wps
+
diff --git a/nc2wps/Makefile.irene_RegIPSL b/nc2wps/Makefile.irene_RegIPSL
new file mode 100644
index 0000000000000000000000000000000000000000..421be654bd36d3294de6d5912d668c895ccf8ed2
--- /dev/null
+++ b/nc2wps/Makefile.irene_RegIPSL
@@ -0,0 +1,53 @@
+# Makefile for netcdf2wps tool.
+#   From netcdf to WPS' ungrib output
+#   - Compilation for JeanZay (IDRIS)
+#source $CCCWORKDIR/RegIPSL/regipsl/RegIPSL/modeles/ARCH/irene.def
+#module load netcdf-fortran/4.5.3 mpi/intelmpi/21.4.0
+
+FC = ifort
+F90FLAGS = -FR -convert big_endian
+DEBUG = #-g -O2 -traceback -fp-stack-check -ftrapuv -check bounds
+LOPT                = -lnetcdff -lnetcdf
+#CPPFLAGS            = -D_UNDERSCORE -DBYTESWAP -DLINUX -DIO_NETCDF -DBIT32 -DNO_SIGNAL
+#CPPFLAGS            = -D_UNDERSCORE  -DLINUX -DIO_NETCDF -DIO_BINARY -DIO_GRIB1 -DBIT32 -D_MPI
+#CPPFLAGS            = -D_UNDERSCORE -DBYTESWAP -DLINUX -DIO_NETCDF -DIO_BINARY -DIO_GRIB1 -DBIT32 -D_MPI
+NETCDFLIBS 		= -L/ccc/products/ccc_users_env/compil/Rhel_8__x86_64/netcdf-c-4.6.0/intel--20.0.2__openmpi--4.0.1/hdf5__parallel/lib -L/ccc/products/ccc_users_env/compil/Rhel_8__x86_64/netcdf-fortran-4.4.4/intel--20.0.0__openmpi--4.0.1/hdf5__parallel/lib
+NETCDFINCS		= -I/ccc/products/ccc_users_env/compil/Rhel_8__x86_64/netcdf-fortran-4.4.4/intel--20.0.0__openmpi--4.0.1/hdf5__parallel/include
+FOPT 	= $(NETCDFLIBS) $(NETCDFINCS)
+
+####### ###### ##### #### ### ## #
+
+MODULES = \
+	stringop.o \
+	errioipsl.o \
+	calendar.o \
+	met_data_module.o \
+	module_definitions.o \
+	module_netcdf_utils.o \
+	module_ncwps.o
+
+all : \
+	read_FILE \
+	test \
+	netcdf2wps
+
+clean : 
+	rm read_FILE netcdf2wps *.o *.mod
+
+clean_wrtcode : 
+	rm netcdf2wps module_netcdf_utils.mod module_netcdf_utils.o module_ncwps.o
+
+## Compilation
+
+%.o: %.f90
+	$(FC) -c $(F90FLAGS) $(CPPFLAGS) $(DEBUG) $(FOPT) $(LOPT) -o $@ $<
+
+read_FILE: $(MODULES) 
+	       $(FC) $(F90FLAGS) $(MODULES) $(DEBUG) $(LOPT) $(FOPT) read_FILE.f90 -o read_FILE
+
+test: $(MODULES) 
+	       $(FC) $(F90FLAGS) $(MODULES) $(DEBUG) $(LOPT) $(FOPT) test.f90 -o test
+
+netcdf2wps: $(MODULES) 
+	       $(FC) $(F90FLAGS) $(MODULES) $(DEBUG) $(LOPT) $(FOPT) netcdf2wps.f90 -o netcdf2wps
+
diff --git a/nc2wps/Makefile.irene_WRF b/nc2wps/Makefile.irene_WRF
new file mode 100644
index 0000000000000000000000000000000000000000..ec1badd0e294bb57c3b88cc2bbd408c3f608debb
--- /dev/null
+++ b/nc2wps/Makefile.irene_WRF
@@ -0,0 +1,54 @@
+# Makefile for netcdf2wps tool.
+#   From netcdf to WPS' ungrib output
+#   - Compilation for JeanZay (IDRIS)
+#module switch dfldatadir/gen6877
+#module load netcdf-c/4.7.4
+#module load netcdf-fortran/4.5.3
+
+FC = ifort
+F90FLAGS = -FR -convert big_endian
+DEBUG = #-g -O2 -traceback -fp-stack-check -ftrapuv -check bounds
+LOPT                = -lnetcdff -lnetcdf
+#CPPFLAGS            = -D_UNDERSCORE -DBYTESWAP -DLINUX -DIO_NETCDF -DBIT32 -DNO_SIGNAL
+#CPPFLAGS            = -D_UNDERSCORE  -DLINUX -DIO_NETCDF -DIO_BINARY -DIO_GRIB1 -DBIT32 -D_MPI
+#CPPFLAGS            = -D_UNDERSCORE -DBYTESWAP -DLINUX -DIO_NETCDF -DIO_BINARY -DIO_GRIB1 -DBIT32 -D_MPI
+NETCDFLIBS 		= -L/ccc/products/ccc_users_env/compil/Rhel_8__x86_64/netcdf-c-4.7.4/intel--20.0.0/hdf5__serial/lib -L/ccc/products/ccc_users_env/compil/Rhel_8__x86_64/netcdf-fortran-4.5.3/intel--20.0.0/hdf5__serial/lib
+NETCDFINCS		= -I/ccc/products/ccc_users_env/compil/Rhel_8__x86_64/netcdf-fortran-4.5.3/intel--20.0.0/hdf5__serial/include -I/ccc/products/ccc_users_env/compil/Rhel_8__x86_64/netcdf-fortran-4.5.3/intel--20.0.0/hdf5__serial/include
+FOPT 	= $(NETCDFLIBS) $(NETCDFINCS)
+
+####### ###### ##### #### ### ## #
+
+MODULES = \
+	stringop.o \
+	errioipsl.o \
+	calendar.o \
+	met_data_module.o \
+	module_definitions.o \
+	module_netcdf_utils.o \
+	module_ncwps.o
+
+all : \
+	read_FILE \
+	test \
+	netcdf2wps
+
+clean : 
+	rm read_FILE netcdf2wps *.o *.mod
+
+clean_wrtcode : 
+	rm netcdf2wps module_netcdf_utils.mod module_netcdf_utils.o module_ncwps.o
+
+## Compilation
+
+%.o: %.f90
+	$(FC) -c $(F90FLAGS) $(CPPFLAGS) $(DEBUG) $(FOPT) $(LOPT) -o $@ $<
+
+read_FILE: $(MODULES) 
+	       $(FC) $(F90FLAGS) $(MODULES) $(DEBUG) $(LOPT) $(FOPT) read_FILE.f90 -o read_FILE
+
+test: $(MODULES) 
+	       $(FC) $(F90FLAGS) $(MODULES) $(DEBUG) $(LOPT) $(FOPT) test.f90 -o test
+
+netcdf2wps: $(MODULES) 
+	       $(FC) $(F90FLAGS) $(MODULES) $(DEBUG) $(LOPT) $(FOPT) netcdf2wps.f90 -o netcdf2wps
+
diff --git a/nc2wps/module_definitions.f90 b/nc2wps/module_definitions.f90
index dbba053bc7b5cad9bfc6efd7b7588caac3eaf306..62f87529e28b5498ed9cb799a98e41d633575778 100644
--- a/nc2wps/module_definitions.f90
+++ b/nc2wps/module_definitions.f90
@@ -6,6 +6,8 @@ MODULE module_definitions
   INTEGER, PARAMETER                                     :: r_k = KIND(1.d0)
   REAL(r_k), PARAMETER                                   :: zeroRK = 0.
   REAL(r_k), PARAMETER                                   :: oneRK = 1.
+  
+  REAL(r_k), PARAMETER                                   :: epsilonv = 1.e-6
 
   REAL, PARAMETER                                        :: CtoK = 273.15
 
@@ -89,9 +91,18 @@ MODULE module_definitions
   ! When providing the values, maximum amount of pressure levels to interpolate
   INTEGER, PARAMETER                                     :: maxNpres = 100
 
-  ! Amount of input variables
-  INTEGER, PARAMETER                                     :: Ninvars = 30
+  ! Amount of standard input variables
+  INTEGER, PARAMETER                                     :: Ninvars = 31
   
+  ! Amount of extra input variables (Ninvars + 'DZS', 'ZS' 
+  INTEGER, PARAMETER                                     :: Nextrainvars = 33
+
+  ! Variable index for 'DZS'
+  INTEGER, PARAMETER                                     :: idzsv = 32
+
+  ! Variable index for 'ZS'
+  INTEGER, PARAMETER                                     :: izsv = 33
+
 !  ! universal gas constant
 !  REAL, PARAMETER                                        :: Rstar = 8.3144598
 
@@ -109,10 +120,30 @@ MODULE module_definitions
 
   ! Earth radius WSG84 [km]
   REAL(r_k), PARAMETER                                   :: EarthradiiWGS84 = 6371.009
+  
+  ! Rd: gas constant of dry air (J deg^-1 kg^-1)
+  REAL(r_k), PARAMETER                                   :: Rd = 287.
+  
+  ! R/Cp
+  REAL(r_k), PARAMETER                                   :: rcp = 0.286
+  
+  ! p0
+  REAL(r_k), PARAMETER                                   :: p0 = 100000
+
+  ! K --> C temperature transformation
+  REAL(r_k), PARAMETER                                   :: SVPT0 = 273.15
+ ! August-Roche-Magnus approximation
+  REAL(r_k), PARAMETER                                   :: ARM1 = 6.1094
+  REAL(r_k), PARAMETER                                   :: ARM2 = 17.625
+  REAL(r_k), PARAMETER                                   :: ARM3 = 243.04
+
+! Ratio between molecular weights of water and dry air
+  REAL(r_k), PARAMETER                                   :: mol_watdry = 0.622
 
   ! Names of the variables to process
-  ! name of the variables where [varn]= mask, hurs, huss, qvs, uas, vas, tas, tds, ts, sst, ps, psl, 
-  !   snd, ci, ua, va, ta, tda, hur, hus, qv, zg, stl1, stl2, stl3, stl4, swvl1, swvl2, swvl3, swvl4n
+  ! name of the variables where [varn]= mask, orog, hurs, huss, qvs, uas, vas, tas, tds, ts, sst, ps,  
+  !   psl, snd, ci, ua, va, ta, tda, hur, hus, qv, zg, stl1, stl2, stl3, stl4, swvl1, swvl2, swvl3, 
+  !   swvl4n
 
   ! Type with all the bsic information of the configuration
   TYPE infconfig
@@ -134,7 +165,7 @@ MODULE module_definitions
     ! list of the CF-names variables names to process
     CHARACTER(len=30), DIMENSION(Ninvars)                :: cfvarns
     ! list of variables names to process
-    CHARACTER(len=30), DIMENSION(Ninvars)                :: invarns
+    CHARACTER(len=30), DIMENSION(Nextrainvars)           :: invarns
     ! Parameters of projection of the data
     ! version, xfcst, map_source, iproj, is_wind_grid_rel, startloc, NLg, lonres, latres, centlon, 
     !   truelat1, truelat2, earth_radius,
@@ -190,6 +221,10 @@ MODULE module_definitions
     INTEGER                                              :: inprojvmask
     ! extraction of land/sea mask from an other variable
     CHARACTER(len=Sm)                                    :: varVland
+    ! Name of orog
+    CHARACTER(len=St)                                    :: invorogn
+    ! Projection of orog
+    INTEGER                                              :: inprojvorog
     ! Name of hurs
     CHARACTER(len=St)                                    :: invhursn
     ! Projection of hurs
@@ -326,6 +361,14 @@ MODULE module_definitions
     CHARACTER(len=St)                                    :: invswvl4n
     ! Projection of swvl4
     INTEGER                                              :: inprojvswvl4
+    ! Name of ZS. Specific for WRFstl, WRFswvl
+    CHARACTER(len=St)                                    :: invzsn
+    ! Projection of ZS
+    INTEGER                                              :: inprojvzs
+    ! Name of DZS. Specific for WRFstl, WRFswvl
+    CHARACTER(len=St)                                    :: invdzsn
+    ! Projection of DZS
+    INTEGER                                              :: inprojvdzs
     ! top of pressure (for p_top_requested < level(levellen))
     INTEGER                                              :: p_top
     ! Maximum time difference (minutes)
@@ -343,7 +386,7 @@ MODULE module_definitions
     ! projection of each file
     CHARACTER(len=Sl), DIMENSION(maxNfiles)              :: infilens
     ! projection for each variable to process (-1, if is not passed)
-    INTEGER, DIMENSION(Ninvars)                          :: inprojv
+    INTEGER, DIMENSION(Nextrainvars)                     :: inprojv
     ! projection of each file
     INTEGER, DIMENSION(maxNfiles)                        :: infileproj
     ! amount of variables in each projection
@@ -351,28 +394,28 @@ MODULE module_definitions
     ! amount of files in each projection
     INTEGER, DIMENSION(maxNprojs)                        :: inNpfile
     ! name of the variables in each projection
-    CHARACTER(len=30), DIMENSION(maxNprojs,Ninvars)      :: inprojvars
+    CHARACTER(len=30), DIMENSION(maxNprojs,Nextrainvars) :: inprojvars
     ! amount of opened netCDF files in each projection by variables found
     INTEGER, DIMENSION(maxNprojs)                        :: inNpncids
     ! index of file in each projection
     INTEGER, DIMENSION(maxNprojs,maxNfiles)              :: inprojifile
     ! name of file in each projection
-    CHARACTER(len=200), DIMENSION(maxNprojs,maxNfiles)   :: inprojfilen
+    CHARACTER(len=Sl), DIMENSION(maxNprojs,maxNfiles)    :: inprojfilen
     ! opened netCDF file in each projection
     INTEGER, DIMENSION(maxNprojs,maxNfiles)              :: inprojncid
     ! amount of variables to process per file
     INTEGER, DIMENSION(maxNfiles)                        :: inNfvars
     ! amount of files with the variables to process
-    INTEGER, DIMENSION(Ninvars)                          :: Nvarinfile
+    INTEGER, DIMENSION(Nextrainvars)                     :: Nvarinfile
     ! variables to process located at which i-file
-    INTEGER, DIMENSION(Ninvars,maxNfiles)                :: varinfile
+    INTEGER, DIMENSION(Nextrainvars,maxNfiles)           :: varinfile
     ! variables to process in each file
-    CHARACTER(len=30), DIMENSION(maxNfiles,Ninvars)      :: filewithvar
+    CHARACTER(len=30), DIMENSION(maxNfiles,Nextrainvars) :: filewithvar
     ! variables to process located at which ncid
-    INTEGER, DIMENSION(Ninvars,maxNfiles)                :: varinncid
+    INTEGER, DIMENSION(Nextrainvars,maxNfiles)           :: varinncid
   END TYPE infconfig
 
-  ! Type with all the bsic information of the execution of the program
+  ! Type with all the basic information of the execution of the program
   TYPE infrun
     ! Should lon be read
     LOGICAL                                              :: computelon
@@ -388,6 +431,8 @@ MODULE module_definitions
     LOGICAL, DIMENSION(Ninvars)                          :: computeinvarns
     ! Should mask be computed & written
     LOGICAL                                              :: computemask
+    ! Should orog be computed & written
+    LOGICAL                                              :: computeorog
     ! Should hurs be computed & written
     LOGICAL                                              :: computehurs
     ! Should huss be computed & written
diff --git a/nc2wps/module_ncwps.f90 b/nc2wps/module_ncwps.f90
index 5a12ff090a2928141370b165a690a43fa256ecee..2db932c0509dd473dda17e423b60e8a3f6591c02 100644
--- a/nc2wps/module_ncwps.f90
+++ b/nc2wps/module_ncwps.f90
@@ -376,7 +376,7 @@ MODULE module_ncwps
     CHARACTER(len=50)                                    :: fname
 
 !!!!!!! Variables
-! height: Height at which the pressure will be obtained [m]
+! pressure: pressure at which the height will be obtained [Pa]
 
     fname = 'hgt_barometric'
     
@@ -485,6 +485,7 @@ MODULE module_ncwps
     END DO
     PRINT *, spc // spc // 'mask projection: ', icnf%inprojvmask
     PRINT *, spc // spc // 'extraction of land/sea mask from an other variable: ', TRIM(icnf%varVland)
+    PRINT *, spc // spc // 'Projection of orog: ', icnf%inprojvorog
     PRINT *, spc // spc // 'Projection of hurs: ', icnf%inprojvhurs
     PRINT *, spc // spc // 'Projection of huss: ', icnf%inprojvhuss
     PRINT *, spc // spc // 'Projection of qvs: ', icnf%inprojvqvs
@@ -553,6 +554,8 @@ MODULE module_ncwps
     SELECT CASE (TRIM(vn))
       CASE('mask')
         LongName = 'land/sea mask (1: land, 0: sea)'
+      CASE('orog')
+        LongName = 'Orography height above geoide'
       CASE('hurs')
         LongName = '2m relative humidity'
       CASE('huss')
@@ -682,6 +685,13 @@ MODULE module_ncwps
       irunf%computemask = .FALSE.
     END IF
     iv = iv + 1
+    ! orog
+    IF (TRIM(icnf%invorogn) /= 'None' .AND. icnf%inprojvorog == ip) THEN
+      irunf%computeorog = .TRUE.
+      irunf%computeinvarns(iv) = .TRUE.
+    ELSE
+      irunf%computeorog = .FALSE.
+    END IF
     ! hurs
     IF (TRIM(icnf%invhursn) /= 'None' .AND. icnf%inprojvhurs == ip) THEN
       irunf%computehurs = .TRUE.
@@ -1043,7 +1053,7 @@ MODULE module_ncwps
     ELSE IF (extraconfv(1) == 'extrapmean') THEN
       CALL ExpectArgs(extraconf, 'extrap,[varn],[projvar],[varmeann],[type]', ',')
       varn2 = TRIM(extraconfv(4))
-      CALL multisearch_var(dbg, nfiles, ncids, TRIM(varn2), Nfound2, foundfns2, foundncids2)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, TRIM(varn2), Nfound2, foundfns2, foundncids2)
       typev = TRIM(extraconfv(5))
     ELSE
       Navailtypev = 3
@@ -1071,9 +1081,11 @@ MODULE module_ncwps
         " found at unit ", foundncids(1:Nfound)
       IF (ALLOCATED(dimts)) DEALLOCATE(dimts)
       ALLOCATE(dimts(Nfound))
+      dimts = 0
 
       DO i=1, Nfound
         CALL read_dimlength (foundncids(i), TRIM(indtimen), dimts(i))
+        PRINT *,'  Lluis 0 id:', foundncids(i), 'dimt', dimts(i)
       END DO
 
       IF ( (extraconfv(1) == 'constant') .OR. (extraconfv(1) == 'extrap') ) THEN
@@ -1086,6 +1098,7 @@ MODULE module_ncwps
           ALLOCATE(new4D(dimx, dimy, Nextr, dimts(i)))
 
           ! How to extrapolate ?
+          PRINT *,'  Lluis id:', foundncids(i), 'dimt', dimts(i)
           CALL compute_extrapol(foundncids(i), dimx, dimy, dimts(i), extraconfv(2), indtimen, typev,    &
             Nextr, extrvals, var4D)
 
@@ -1166,10 +1179,11 @@ MODULE module_ncwps
       
     END IF
          
-    DEALLOCATE(extraconfv)
-    DEALLOCATE(dimts)
-    DEALLOCATE(var4D)
-    DEALLOCATE(new4d)
+    IF (ALLOCATED(extraconfv)) DEALLOCATE(extraconfv)
+    IF (ALLOCATED(availtypev)) DEALLOCATE(availtypev)
+    IF (ALLOCATED(dimts)) DEALLOCATE(dimts)
+    IF (ALLOCATED(var4D)) DEALLOCATE(var4D)
+    IF (ALLOCATED(new4d)) DEALLOCATE(new4d)
      
     RETURN
     
@@ -1182,14 +1196,15 @@ MODULE module_ncwps
     invlonn, invlatn, invtimen, invplevn, invmodlevn,                                                 &
     version, xfcst, map_source, iproj, is_wind_grid_rel, startloc, NLg, lonres, latres, centlon,      &
     truelat1, truelat2, earth_radius,                                                                 &
-    invmaskn, invhursn, invhussn, invqvsn, invuasn, invvasn, invtasn, invtdsn, invtsn, invsstn,       &
-    invpsn, invpsln, invsndn, invcin, invuan, invvan, invtan, invtdan, invhurn, invhusn, invqvn,      &
-    invzgn, invstl1n, invstl2n, invstl3n, invstl4n, invswvl1n, invswvl2n, invswvl3n, invswvl4n,       &
-    inprojvmask, inprojvhurs, inprojvhuss, inprojvqvs, inprojvuas, inprojvvas, inprojvtas,            &
-    inprojvtds, inprojvts, inprojvsst, inprojvps, inprojvpsl, inprojvsnd, inprojvci, inprojvua,       &
-    inprojvva, inprojvta, inprojvtda, inprojvhur, inprojvhus, inprojvqv, inprojvzg, inprojvstl1,      &
-    inprojvstl2, inprojvstl3, inprojvstl4, inprojvswvl1, inprojvswvl2, inprojvswvl3, inprojvswvl4,    &
-    icnf, dbg)
+    invmaskn, invorogn, invhursn, invhussn, invqvsn, invuasn, invvasn, invtasn, invtdsn, invtsn,      &
+    invsstn, invpsn, invpsln, invsndn, invcin, invuan, invvan, invtan, invtdan, invhurn, invhusn,     &
+    invqvn, invzgn, invstl1n, invstl2n, invstl3n, invstl4n, invswvl1n, invswvl2n, invswvl3n,          &
+    invswvl4n, inptua, inptva, inptta, inpttda, inptqv, inpthur, inpthus, inptzg,                     &
+    inprojvmask, inprojvorog, inprojvhurs, inprojvhuss, inprojvqvs, inprojvuas, inprojvvas,           &
+    inprojvtas, inprojvtds, inprojvts, inprojvsst, inprojvps, inprojvpsl, inprojvsnd, inprojvci,      &
+    inprojvua, inprojvva, inprojvta, inprojvtda, inprojvhur, inprojvhus, inprojvqv, inprojvzg,        &
+    inprojvstl1, inprojvstl2, inprojvstl3, inprojvstl4, inprojvswvl1, inprojvswvl2, inprojvswvl3,     &
+    inprojvswvl4, icnf, dbg)
   ! Subroutine to initialize pojection dimension-values
 
     IMPLICIT NONE
@@ -1213,24 +1228,30 @@ MODULE module_ncwps
     CHARACTER(len=8), DIMENSION(Nprojs), INTENT(in)      :: startloc
     REAL, DIMENSION(Nprojs), INTENT(in)                  :: lonres, latres, centlon, truelat1,        &
       truelat2, earth_radius
-    CHARACTER(len=St), INTENT(in)                        :: invmaskn, invhursn, invhussn, invqvsn,    &
-      invuasn, invvasn, invtasn, invtdsn, invtsn, invsstn, invpsn, invpsln, invsndn, invcin, invuan,  &
-      invvan, invtan, invtdan, invhurn, invhusn, invqvn, invzgn, invstl1n, invstl2n, invstl3n,        &
+    CHARACTER(len=St), INTENT(in)                        :: invmaskn, invorogn, invhursn, invhussn,   &
+      invqvsn, invuasn, invvasn, invtasn, invtdsn, invtsn, invsstn, invpsn, invpsln, invsndn, invcin, &
+      invuan, invvan, invtan, invtdan, invhurn, invhusn, invqvn, invzgn, invstl1n, invstl2n, invstl3n,&
       invstl4n, invswvl1n, invswvl2n, invswvl3n, invswvl4n
-    INTEGER, INTENT(in)                                  :: inprojvmask, inprojvhurs, inprojvhuss,    &
-      inprojvqvs, inprojvuas, inprojvvas, inprojvtas, inprojvtds, inprojvts, inprojvsst, inprojvps,   &
-      inprojvpsl, inprojvsnd, inprojvci, inprojvua, inprojvva, inprojvta, inprojvtda, inprojvhur,     &
-      inprojvhus, inprojvqv, inprojvzg, inprojvstl1, inprojvstl2, inprojvstl3, inprojvstl4,           &
-      inprojvswvl1, inprojvswvl2, inprojvswvl3, inprojvswvl4
+    CHARACTER(len=Su), INTENT(in)                        :: inptua, inptva, inptta, inpttda, inptqv,  &
+      inpthur, inpthus, inptzg
+    INTEGER, INTENT(in)                                  :: inprojvmask, inprojvorog, inprojvhurs,    &
+      inprojvhuss, inprojvqvs, inprojvuas, inprojvvas, inprojvtas, inprojvtds, inprojvts, inprojvsst, &
+      inprojvps, inprojvpsl, inprojvsnd, inprojvci, inprojvua, inprojvva, inprojvta, inprojvtda,      &
+      inprojvhur, inprojvhus, inprojvqv, inprojvzg, inprojvstl1, inprojvstl2, inprojvstl3,            &
+      inprojvstl4, inprojvswvl1, inprojvswvl2, inprojvswvl3, inprojvswvl4
     LOGICAL, INTENT(in)                                  :: dbg
     TYPE(infconfig), INTENT(inout)                       :: icnf
 
     ! Local
-    INTEGER                                              :: iv, ip, iiNp, inv, iiv
+    INTEGER                                              :: iv, ivi, ip, iiNp, inv, iiv
     INTEGER                                              :: Npv, ncid, dtimev, Nfncid
+    INTEGER                                              :: Nindims, iind
+    INTEGER                                              :: Nfproj
     INTEGER, DIMENSION(nfiles)                           :: fifiles
     INTEGER, DIMENSION(nfiles)                           :: fncids
+    CHARACTER(len=Sm), DIMENSION(100)                    :: indimns
     CHARACTER(len=St)                                    :: invn
+    LOGICAL                                              :: inproj
     CHARACTER(len=Ss)                                    :: fname
 
 !!!!!!! Variables
@@ -1240,9 +1261,10 @@ MODULE module_ncwps
 ! Nintpres: amount of passed pressure-levels for p-level interpolation
 ! ind[lon/lat/time/plev/modlev]n: name of the x, y, z, t dimensions for each projection
 ! Nvars: amount of variables to process (22)
-! inv[varn]n: name of the variables where [varn]= mask, hurs, huss, qvs, uas, vas, tas, tds, ts, sst, 
-!   ps, psl, snd, ci, ua, va, ta, tda, hur, hus, qv, zg, stl1, stl2, stl3, stl4, swvl1, swvl2, swvl3, 
-!   swvl4
+! inv[varn]n: name of the variables where [varn]= mask, orog, hurs, huss, qvs, uas, vas, tas, tds, ts,  
+!   sst, ps, psl, snd, ci, ua, va, ta, tda, hur, hus, qv, zg, stl1, stl2, stl3, stl4, swvl1, swvl2,  
+!   swvl3, swvl4
+! inpt[varn]: assigned type of vertical levels of the variables
 ! inprojv[varn]: assigned projection of the variables
 ! [lon/lat/plev/modlev]lenproj: length of the dimensions in each projection
 ! invarns: list of variables to process
@@ -1282,35 +1304,36 @@ MODULE module_ncwps
 
     ! List of cf-convention names of the variables to process (ordered as their information is loaded)
     icnf%cfvarns(1) = 'mask'
-    icnf%cfvarns(2) = 'hurs'
-    icnf%cfvarns(3) = 'huss'
-    icnf%cfvarns(4) = 'qvs'
-    icnf%cfvarns(5) = 'uas'
-    icnf%cfvarns(6) = 'vas'
-    icnf%cfvarns(7) = 'tas'
-    icnf%cfvarns(8) = 'tds'
-    icnf%cfvarns(9) = 'ts'
-    icnf%cfvarns(10) = 'sst'
-    icnf%cfvarns(11) = 'ps'
-    icnf%cfvarns(12) = 'psl'
-    icnf%cfvarns(13) = 'snd'
-    icnf%cfvarns(14) = 'ci'
-    icnf%cfvarns(15) = 'ua'
-    icnf%cfvarns(16) = 'va'
-    icnf%cfvarns(17) = 'ta'
-    icnf%cfvarns(18) = 'tda'
-    icnf%cfvarns(19) = 'hur'
-    icnf%cfvarns(20) = 'hus'
-    icnf%cfvarns(21) = 'qv'
-    icnf%cfvarns(22) = 'zg'
-    icnf%cfvarns(23) = 'stl1'
-    icnf%cfvarns(24) = 'stl2'
-    icnf%cfvarns(25) = 'stl3'
-    icnf%cfvarns(26) = 'stl4'
-    icnf%cfvarns(27) = 'swvl1'
-    icnf%cfvarns(28) = 'swvl2'
-    icnf%cfvarns(29) = 'swvl3'
-    icnf%cfvarns(30) = 'swvl4'
+    icnf%cfvarns(2) = 'orog'
+    icnf%cfvarns(3) = 'hurs'
+    icnf%cfvarns(4) = 'huss'
+    icnf%cfvarns(5) = 'qvs'
+    icnf%cfvarns(6) = 'uas'
+    icnf%cfvarns(7) = 'vas'
+    icnf%cfvarns(8) = 'tas'
+    icnf%cfvarns(9) = 'tds'
+    icnf%cfvarns(10) = 'ts'
+    icnf%cfvarns(11) = 'sst'
+    icnf%cfvarns(12) = 'ps'
+    icnf%cfvarns(13) = 'psl'
+    icnf%cfvarns(14) = 'snd'
+    icnf%cfvarns(15) = 'ci'
+    icnf%cfvarns(16) = 'ua'
+    icnf%cfvarns(17) = 'va'
+    icnf%cfvarns(18) = 'ta'
+    icnf%cfvarns(19) = 'tda'
+    icnf%cfvarns(20) = 'hur'
+    icnf%cfvarns(21) = 'hus'
+    icnf%cfvarns(22) = 'qv'
+    icnf%cfvarns(23) = 'zg'
+    icnf%cfvarns(24) = 'stl1'
+    icnf%cfvarns(25) = 'stl2'
+    icnf%cfvarns(26) = 'stl3'
+    icnf%cfvarns(27) = 'stl4'
+    icnf%cfvarns(28) = 'swvl1'
+    icnf%cfvarns(29) = 'swvl2'
+    icnf%cfvarns(30) = 'swvl3'
+    icnf%cfvarns(31) = 'swvl4'
 
     icnf%invarns = ''
     icnf%inprojv = -1
@@ -1356,7 +1379,7 @@ MODULE module_ncwps
     iv = 0
     ! Going through all variables
 
-    !mask
+    !1. mask
     iv = iv + 1
     icnf%invmaskn = invmaskn
     IF (TRIM(invmaskn) /= 'None' .AND. TRIM(invmaskn) /= 'varVland') THEN
@@ -1368,7 +1391,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -1376,20 +1399,85 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invmaskn)
       icnf%inprojv(iv) = -1
     END IF
-    !hurs
+    !2. orog
+    iv = iv + 1
+    icnf%invorogn = invorogn
+    IF (TRIM(invorogn) /= 'None') THEN
+      invn = icnf%invorogn
+      ip = inprojvorog
+      icnf%inprojvorog = ip
+      inv = icnf%inNpvars(ip) + 1
+      icnf%invarns(iv) = TRIM(invn)
+      icnf%inprojv(iv) = ip
+      icnf%inNpvars(ip) = inv
+      icnf%inprojvars(ip,inv) = TRIM(invn)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      iiNp = icnf%inNpncids(ip) + 1
+      icnf%Nvarinfile(iv) = Nfncid
+      icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
+      icnf%varinncid(iv,1:Nfncid) = fncids(1:Nfncid)
+      icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
+      DO iiv=1, Nfncid
+        icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
+          icnf%infileproj(fifiles(iiv)) = ip
+          icnf%inNpfile(ip) = 1
+          icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+          icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
+        END IF
+        icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
+      END DO
+    ELSE
+      icnf%invarns(iv) = TRIM(invorogn)
+      icnf%inprojv(iv) = -1
+    END IF
+    !3. hurs
     iv = iv + 1
     icnf%invhursn = invhursn
     IF (TRIM(invhursn) /= 'None') THEN
@@ -1401,7 +1489,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -1409,20 +1497,36 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invhursn)
       icnf%inprojv(iv) = -1
     END IF
-    !huss
+    !4. huss
     iv = iv + 1
     icnf%invhussn = invhussn
     IF (TRIM(invhussn) /= 'None') THEN
@@ -1434,7 +1538,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -1442,20 +1546,36 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invhussn)
       icnf%inprojv(iv) = -1
     END IF
-    !qvs
+    !5. qvs
     iv = iv + 1
     icnf%invqvsn = invqvsn
     IF (TRIM(invqvsn) /= 'None') THEN
@@ -1467,7 +1587,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -1475,20 +1595,36 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invqvsn)
       icnf%inprojv(iv) = -1
     END IF
-    !uas
+    !6. uas
     iv = iv + 1
     icnf%invuasn = invuasn
     IF (TRIM(invuasn) /= 'None') THEN
@@ -1500,7 +1636,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -1508,20 +1644,36 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invuasn)
       icnf%inprojv(iv) = -1
     END IF
-    !vas
+    !7. vas
     iv = iv + 1
     icnf%invvasn = invvasn
     IF (TRIM(invvasn) /= 'None') THEN
@@ -1533,7 +1685,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -1541,20 +1693,36 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invvasn)
       icnf%inprojv(iv) = -1
     END IF
-    !tas
+    !8. tas
     iv = iv + 1
     icnf%invtasn = invtasn
     IF (TRIM(invtasn) /= 'None') THEN
@@ -1566,7 +1734,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -1574,20 +1742,36 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invtasn)
       icnf%inprojv(iv) = -1
     END IF
-    !tds
+    !9. tds
     iv = iv + 1
     icnf%invtdsn = invtdsn
     IF (TRIM(invtdsn) /= 'None') THEN
@@ -1599,7 +1783,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -1607,20 +1791,36 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invtdsn)
       icnf%inprojv(iv) = -1
     END IF
-    !ts
+    !10. ts
     iv = iv + 1
     icnf%invtsn = invtsn
     IF (TRIM(invtsn) /= 'None') THEN
@@ -1632,7 +1832,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -1640,20 +1840,36 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invtsn)
       icnf%inprojv(iv) = -1
     END IF
-    !sst
+    !11. sst
     iv = iv + 1
     icnf%invsstn = invsstn
     IF (TRIM(invsstn) /= 'None') THEN
@@ -1665,7 +1881,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -1673,20 +1889,36 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invsstn)
       icnf%inprojv(iv) = -1
     END IF
-    !ps
+    !12. ps
     iv = iv + 1
     icnf%invpsn = invpsn
     IF (TRIM(invpsn) /= 'None') THEN
@@ -1698,7 +1930,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -1706,20 +1938,36 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invpsn)
       icnf%inprojv(iv) = -1
     END IF
-    !psl
+    !13. psl
     iv = iv + 1
     icnf%invpsln = invpsln
     IF (TRIM(invpsln) /= 'None') THEN
@@ -1731,7 +1979,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -1739,20 +1987,36 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invpsln)
       icnf%inprojv(iv) = -1
     END IF
-    !snd
+    !14. snd
     iv = iv + 1
     icnf%invsndn = invsndn
     IF (TRIM(invsndn) /= 'None') THEN
@@ -1764,7 +2028,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -1772,20 +2036,36 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invsndn)
       icnf%inprojv(iv) = -1
     END IF
-    !ci
+    !15. ci
     iv = iv + 1
     icnf%invcin = invcin
     IF (TRIM(invcin) /= 'None') THEN
@@ -1797,7 +2077,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -1805,22 +2085,39 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invcin)
       icnf%inprojv(iv) = -1
     END IF
-    !ua
+    !16. ua
     iv = iv + 1
     icnf%invuan = invuan
+    IF (TRIM(inptua) /= 'plev') icnf%inptua = inptua
     IF (TRIM(invuan) /= 'None') THEN
       invn = icnf%invuan
       ip = inprojvua
@@ -1830,7 +2127,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -1838,22 +2135,39 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invuan)
       icnf%inprojv(iv) = -1
     END IF
-    !va
+    !17. va
     iv = iv + 1
     icnf%invvan = invvan
+    IF (TRIM(inptva) /= 'plev') icnf%inptva = inptva
     IF (TRIM(invvan) /= 'None') THEN
       invn = icnf%invvan
       ip = inprojvva
@@ -1863,7 +2177,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -1871,23 +2185,40 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invvan)
       icnf%inprojv(iv) = -1
     END IF
-    !ta
+    !18. ta
     iv = iv + 1
     icnf%invtan = invtan
-    IF (TRIM(invtan) /= 'None') THEN
+    IF (TRIM(inptta) /= 'plev') icnf%inptta = inptta
+    IF (TRIM(invtan) /= 'None' .AND. TRIM(invtan) /= 'WRFta') THEN
       invn = icnf%invtan
       ip = inprojvta
       icnf%inprojvta = ip
@@ -1896,7 +2227,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -1904,22 +2235,39 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invtan)
       icnf%inprojv(iv) = -1
     END IF
-    !tda
+    !19. tda
     iv = iv + 1
     icnf%invtdan = invtdan
+    IF (TRIM(inpttda) /= 'plev') icnf%inpttda = inpttda
     IF (TRIM(invtdan) /= 'None') THEN
       invn = icnf%invtdan
       ip = inprojvtda
@@ -1929,7 +2277,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -1937,22 +2285,39 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invtdan)
       icnf%inprojv(iv) = -1
     END IF
-    !hur
+    !20. hur
     iv = iv + 1
     icnf%invhurn = invhurn
+    IF (TRIM(inpthur) /= 'plev') icnf%inpthur = inpthur
     IF (TRIM(invhurn) /= 'None') THEN
       invn = icnf%invhurn
       ip = inprojvhur
@@ -1962,7 +2327,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -1970,22 +2335,39 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invhurn)
       icnf%inprojv(iv) = -1
     END IF
-    !hus
+    !21. hus
     iv = iv + 1
     icnf%invhusn = invhusn
+    IF (TRIM(inpthus) /= 'plev') icnf%inpthus = inpthus
     IF (TRIM(invhusn) /= 'None') THEN
       invn = icnf%invhusn
       ip = inprojvhus
@@ -1995,7 +2377,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -2003,22 +2385,39 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invhusn)
       icnf%inprojv(iv) = -1
     END IF
-    !qv
+    !22. qv
     iv = iv + 1
     icnf%invqvn = invqvn
+    IF (TRIM(inptqv) /= 'plev') icnf%inptqv = inptqv
     IF (TRIM(invqvn) /= 'None') THEN
       invn = icnf%invqvn
       ip = inprojvqv
@@ -2028,7 +2427,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -2036,23 +2435,40 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invqvn)
       icnf%inprojv(iv) = -1
     END IF
-    !zg
+    !23. zg
     iv = iv + 1
     icnf%invzgn = invzgn
-    IF (TRIM(invzgn) /= 'None') THEN
+    IF (TRIM(inptzg) /= 'plev') icnf%inptzg = inptzg
+    IF (TRIM(invzgn) /= 'None' .AND. TRIM(invzgn) /= 'WRFgeop') THEN
       invn = icnf%invzgn
       ip = inprojvzg
       icnf%inprojvzg = ip
@@ -2061,7 +2477,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -2069,23 +2485,40 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invzgn)
       icnf%inprojv(iv) = -1
     END IF
-    !stl1
+    !24. stl1
     iv = iv + 1
     icnf%invstl1n = invstl1n
-    IF (TRIM(invstl1n) /= 'None' .AND. TRIM(invstl1n) /= 'tskextrap') THEN
+    IF (TRIM(invstl1n) /= 'None' .AND. TRIM(invstl1n) /= 'tskextrap' .AND.                            &
+      TRIM(invstl1n) /= 'WRFstl') THEN
       invn = icnf%invstl1n
       ip = inprojvstl1
       icnf%inprojvstl1 = ip
@@ -2094,7 +2527,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -2102,23 +2535,85 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invstl1n)
       icnf%inprojv(iv) = -1
+      ! Looking for file with 'ZS' if it is in another file, it does not get assigned to a given
+      !   projection
+      IF (TRIM(invstl1n) == 'WRFstl') THEN
+        ivi = izsv
+        invn = 'ZS'
+        ip = inprojvstl1
+        icnf%inprojvstl1 = ip
+        inv = icnf%inNpvars(ip) + 1
+        icnf%invarns(ivi) = TRIM(invn)
+        icnf%inprojv(ivi) = ip
+        icnf%inNpvars(ip) = inv
+        icnf%inprojvars(ip,inv) = TRIM(invn)
+        CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+        iiNp = icnf%inNpncids(ip) + 1
+        icnf%Nvarinfile(ivi) = Nfncid
+        icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
+        icnf%varinncid(ivi,1:Nfncid) = fncids(1:Nfncid)
+        icnf%varinfile(ivi,1:Nfncid) = fifiles(1:Nfncid)
+        DO iiv=1, Nfncid
+          icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
+          icnf%infileproj(fifiles(iiv)) = ip
+          icnf%inNpfile(ip) = 1
+          icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+          icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
+        END IF
+          icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
+        END DO
+      END IF
     END IF
-    !stl2
+    !25. stl2
     iv = iv + 1
     icnf%invstl2n = invstl2n
-    IF (TRIM(invstl2n) /= 'None') THEN
+    IF (TRIM(invstl2n) /= 'None' .AND. TRIM(invstl2n) /= 'WRFstl') THEN
       invn = icnf%invstl2n
       ip = inprojvstl2
       icnf%inprojvstl2 = ip
@@ -2127,7 +2622,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -2135,23 +2630,39 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invstl2n)
       icnf%inprojv(iv) = -1
     END IF
-    !stl3
+    !26. stl3
     iv = iv + 1
     icnf%invstl3n = invstl3n
-    IF (TRIM(invstl3n) /= 'None') THEN
+    IF (TRIM(invstl3n) /= 'None' .AND. TRIM(invstl3n) /= 'WRFstl') THEN
       invn = icnf%invstl3n
       ip = inprojvstl3
       icnf%inprojvstl3 = ip
@@ -2160,7 +2671,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -2168,23 +2679,39 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invstl3n)
       icnf%inprojv(iv) = -1
     END IF
-    !stl4
+    !27. stl4
     iv = iv + 1
     icnf%invstl4n = invstl4n
-    IF (TRIM(invstl4n) /= 'None') THEN
+    IF (TRIM(invstl4n) /= 'None' .AND. TRIM(invstl4n) /= 'WRFstl') THEN
       invn = icnf%invstl4n
       ip = inprojvstl4
       icnf%inprojvstl4 = ip
@@ -2193,7 +2720,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -2201,23 +2728,40 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invstl4n)
       icnf%inprojv(iv) = -1
     END IF
-    !swvl1
+    !28. swvl1
     iv = iv + 1
     icnf%invswvl1n = invswvl1n
-    IF (TRIM(invswvl1n) /= 'None' .AND. TRIM(invswvl1n) /= 'mrsosextrap') THEN
+    IF (TRIM(invswvl1n) /= 'None' .AND. TRIM(invswvl1n) /= 'mrsosextrap'  .AND.                       &
+      TRIM(invswvl1n) /= 'WRFswvl') THEN
       invn = icnf%invswvl1n
       ip = inprojvswvl1
       icnf%inprojvswvl1 = ip
@@ -2226,7 +2770,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -2234,23 +2778,140 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invswvl1n)
       icnf%inprojv(iv) = -1
+      icnf%invarns(iv) = TRIM(invswvl1n)
+      icnf%inprojv(iv) = -1
+      ! Looking for file with 'DZS' if it is in another file, it does not get assigned to a given
+      !   projection
+      IF (TRIM(invswvl1n) == 'WRFswvl') THEN
+        ! Looking for the presence of 'ZS'
+        inproj = .FALSE.
+        DO iiv=1, icnf%inNpvars(ip)
+          IF (TRIM(icnf%inprojvars(ip,inv)) == 'ZS') THEN
+            inproj = .TRUE.
+            EXIT
+          END IF
+        END DO
+        IF (.NOT.inproj) THEN
+          ivi = izsv
+          invn = 'ZS'
+          ip = inprojvstl1
+          icnf%inprojvstl1 = ip
+          inv = icnf%inNpvars(ip) + 1
+          icnf%invarns(ivi) = TRIM(invn)
+          icnf%inprojv(ivi) = ip
+          icnf%inNpvars(ip) = inv
+          icnf%inprojvars(ip,inv) = TRIM(invn)
+          CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+          iiNp = icnf%inNpncids(ip) + 1
+          icnf%Nvarinfile(ivi) = Nfncid
+          icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
+          icnf%varinncid(ivi,1:Nfncid) = fncids(1:Nfncid)
+          icnf%varinfile(ivi,1:Nfncid) = fifiles(1:Nfncid)
+          DO iiv=1, Nfncid
+            icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
+            ! Assigning files per projection....
+            IF (icnf%inNpfile(ip) == 0) THEN
+              icnf%infileproj(fifiles(iiv)) = ip
+              icnf%inNpfile(ip) = 1
+              icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+              icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+              icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+              IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),       &
+                " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:", &
+                fncids(iiv)
+            ELSE
+              Nfproj = icnf%inNpfile(ip)
+              IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+                icnf%infileproj(fifiles(iiv)) = ip
+                icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+                icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+                icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+                icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+                IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),     &
+                  " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " //ItoS(ip), " ncid:",&
+                  fncids(iiv)
+              END IF
+            END IF
+            icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
+          END DO
+        END IF
+        
+        ivi = idzsv
+        invn = 'DZS'
+        ip = inprojvstl1
+        icnf%inprojvstl1 = ip
+        inv = icnf%inNpvars(ip) + 1
+        icnf%invarns(ivi) = TRIM(invn)
+        icnf%inprojv(ivi) = ip
+        icnf%inNpvars(ip) = inv
+        icnf%inprojvars(ip,inv) = TRIM(invn)
+        CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+        iiNp = icnf%inNpncids(ip) + 1
+        icnf%Nvarinfile(ivi) = Nfncid
+        icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
+        icnf%varinncid(ivi,1:Nfncid) = fncids(1:Nfncid)
+        icnf%varinfile(ivi,1:Nfncid) = fifiles(1:Nfncid)
+        DO iiv=1, Nfncid
+          icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
+          ! Assigning files per projection....
+          IF (icnf%inNpfile(ip) == 0) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          ELSE
+            Nfproj = icnf%inNpfile(ip)
+            IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+              icnf%infileproj(fifiles(iiv)) = ip
+              icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+              icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+              icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+              icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+              IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),       &
+                " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:", &
+                fncids(iiv)
+            END IF
+          END IF
+          icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
+        END DO
+      END IF
     END IF
-    !swvl2
+    !29. swvl2
     iv = iv + 1
     icnf%invswvl2n = invswvl2n
-    IF (TRIM(invswvl2n) /= 'None') THEN
+    IF (TRIM(invswvl2n) /= 'None' .AND. TRIM(invswvl2n) /= 'WRFswvl') THEN
       invn = icnf%invswvl2n
       ip = inprojvswvl2
       icnf%inprojvswvl2 = ip
@@ -2259,7 +2920,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -2267,23 +2928,39 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invswvl2n)
       icnf%inprojv(iv) = -1
     END IF
-    !swvl3
+    !30. swvl3
     iv = iv + 1
     icnf%invswvl3n = invswvl3n
-    IF (TRIM(invswvl3n) /= 'None') THEN
+    IF (TRIM(invswvl3n) /= 'None' .AND. TRIM(invswvl3n) /= 'WRFswvl') THEN
       invn = icnf%invswvl3n
       ip = inprojvswvl3
       icnf%inprojvswvl3 = ip
@@ -2292,7 +2969,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -2300,23 +2977,39 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
       icnf%invarns(iv) = TRIM(invswvl3n)
       icnf%inprojv(iv) = -1
     END IF
-    !swvl4
+    !31. swvl4
     iv = iv + 1
     icnf%invswvl4n = invswvl4n
-    IF (TRIM(invswvl4n) /= 'None') THEN
+    IF (TRIM(invswvl4n) /= 'None' .AND. TRIM(invswvl4n) /= 'WRFswvl') THEN
       invn = icnf%invswvl4n
       ip = inprojvswvl4
       icnf%inprojvswvl4 = ip
@@ -2325,7 +3018,7 @@ MODULE module_ncwps
       icnf%inprojv(iv) = ip
       icnf%inNpvars(ip) = inv
       icnf%inprojvars(ip,inv) = TRIM(invn)
-      CALL multisearch_var(dbg, nfiles, ncids, invn, Nfncid, fifiles, fncids)
+      CALL multisearch_var(dbg, fname, nfiles, ncids, invn, Nfncid, fifiles, fncids)
       iiNp = icnf%inNpncids(ip) + 1
       icnf%Nvarinfile(iv) = Nfncid
       icnf%inNpncids(ip) = icnf%inNpncids(ip) + Nfncid
@@ -2333,13 +3026,29 @@ MODULE module_ncwps
       icnf%varinfile(iv,1:Nfncid) = fifiles(1:Nfncid)
       DO iiv=1, Nfncid
         icnf%inNfvars(fifiles(iiv)) = icnf%inNfvars(fifiles(iiv)) + 1
-        IF (icnf%infileproj(fifiles(iiv)) == -1) THEN
+        ! Assigning files per projection....
+        IF (icnf%inNpfile(ip) == 0) THEN
           icnf%infileproj(fifiles(iiv)) = ip
-          icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+          icnf%inNpfile(ip) = 1
           icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
           icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+          icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+          IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),           &
+            " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",     &
+            fncids(iiv)
+        ELSE
+          Nfproj = icnf%inNpfile(ip)
+          IF (.NOT.isInlistS(Nfproj,icnf%inprojfilen(ip,1:Nfproj),filens(fifiles(iiv)))) THEN
+            icnf%infileproj(fifiles(iiv)) = ip
+            icnf%inNpfile(ip) = icnf%inNpfile(ip) + 1
+            icnf%inprojifile(ip,icnf%inNpfile(ip)) = fifiles(iiv)
+            icnf%inprojfilen(ip,icnf%inNpfile(ip)) = filens(fifiles(iiv))
+            icnf%inprojncid(ip,icnf%inNpfile(ip)) = fncids(iiv)
+            IF (dbg) PRINT *,'    ' // TRIM(fname) // ": Adding file number: ", fifiles(iiv),         &
+              " named '" // TRIM(filens(fifiles(iiv))) // "' in projection " // ItoS(ip), " ncid:",   &
+              fncids(iiv)
+          END IF
         END IF
-        icnf%inprojfilen(ip,iiNp+iiv) = filens(fifiles(iiv))
         icnf%filewithvar(fifiles(iiv),icnf%inNfvars(fifiles(iiv))) = TRIM(invn)
       END DO
     ELSE
@@ -2379,13 +3088,37 @@ MODULE module_ncwps
       DO iv= 1, icnf%inNpfile(ip)
         ncid = icnf%inprojncid(ip,iv)
         IF (icnf%lonlenproj(ip) == -1) THEN
+          IF (.NOT. isdim_infile(filens(icnf%inprojifile(ip,iv)), indlonn(ip))) THEN
+            PRINT *,TRIM(errormsg)
+            PRINT *,'  ' // TRIM(fname) // ": longitud dimension named '" // TRIM(indlonn(ip)) //     &
+              "' does not exist in file'" // TRIM(filens(icnf%inprojifile(ip,iv))) // "' !!"
+            CALL all_dims(ncid, Nindims, indimns)
+            PRINT *,'    available ones:', (TRIM(indimns(iind))//', ',iind=1,Nindims)
+            STOP -1
+          END IF
           CALL read_dimlength (ncid, TRIM(indlonn(ip)), icnf%lonlenproj(ip))
+          IF (.NOT. isdim_infile(filens(icnf%inprojifile(ip,iv)), indlatn(ip))) THEN
+            PRINT *,TRIM(errormsg)
+            PRINT *,'  ' // TRIM(fname) // ": latitud dimension named '" // TRIM(indlatn(ip)) //      &
+              "' does not exist in file'" // TRIM(filens(icnf%inprojifile(ip,iv))) // "' !!"
+            CALL all_dims(ncid, Nindims, indimns)
+            PRINT *,'    available ones:', (TRIM(indimns(iind))//', ',iind=1,Nindims)
+            STOP -1
+          END IF
           CALL read_dimlength (ncid, TRIM(indlatn(ip)), icnf%latlenproj(ip))
         END IF
         
 !       In order to avoid to miss the largest amount of time-steps, we need to loop over all variables
 !        IF ( (lonlenproj(ip) == -1) .AND. ((TRIM(indplevn) /= 'None') .AND. (plevlenproj(ip) == -1))  &
 !          .AND. ((TRIM(indmodlevn) /= 'None') .AND. (modlevlenproj(ip) == -1)) ) EXIT
+        IF (.NOT.isdim_infile(filens(icnf%inprojifile(ip,iv)), indtimen(ip))) THEN
+          PRINT *,TRIM(errormsg)
+          PRINT *,'  ' // TRIM(fname) // ": time dimension named '" // TRIM(indtimen(ip)) //          &
+            "' does not exist in file'" // TRIM(filens(icnf%inprojifile(ip,iv))) // "' !!"
+          CALL all_dims(ncid, Nindims, indimns)
+          PRINT *,'    available ones:', (TRIM(indimns(iind))//', ',iind=1,Nindims)
+          STOP -1
+        END IF
         CALL read_dimlength (ncid, TRIM(indtimen(ip)), dtimev)
         IF (dtimev > icnf%timelenproj(ip)) THEN
           icnf%timelenproj(ip) = dtimev
@@ -2431,19 +3164,19 @@ MODULE module_ncwps
 
   END SUBROUTINE Init_projdims
 
-  SUBROUTINE Init_values(inNskiplev, invmaskn, varVland, invhursn, invhussn, invqvsn, invuasn,        &
-    invvasn, invtasn, invtdsn, invtsn, invsstn, invpsn, invpsln, invsndn, invcin, invtdan, invstl1n,  &
-    tskextrap, invstl2n, invstl3n, invstl4n, invswvl1n, invswvl2n, invswvl3n, invswvl4n, mrsosextrap, &
-    inptua, inptva, inptta, inpttda, inpthur, inpthus, inptqv, inptzg, p_top, maxtimediff,            &
-    itpt, jtpt, ktpt, ltpt, dbg, iconf)
+  SUBROUTINE Init_values(inNskiplev, invmaskn, varVland, invorogn, invhursn, invhussn, invqvsn,       &
+    invuasn, invvasn, invtasn, invtdsn, invtsn, invsstn, invpsn, invpsln, invsndn, invcin, invtdan,   &
+    invstl1n, tskextrap, invstl2n, invstl3n, invstl4n, invswvl1n, invswvl2n, invswvl3n, invswvl4n,    &
+    mrsosextrap, inptua, inptva, inptta, inpttda, inpthur, inpthus, inptqv, inptzg, p_top,            &
+    maxtimediff, itpt, jtpt, ktpt, ltpt, dbg, iconf)
   ! Subroutine to initialize values
 
     IMPLICIT NONE
 
-    CHARACTER(len=*), INTENT(out)                        :: invmaskn, invhursn, invhussn, invqvsn,    &
-      invuasn, invvasn, invtasn, invtdsn, invtsn, invsstn, invpsn, invpsln, invsndn, invcin, invtdan, &
-      invstl1n, tskextrap, invstl2n, invstl3n, invstl4n, invswvl1n, invswvl2n, invswvl3n, invswvl4n,  &
-      mrsosextrap
+    CHARACTER(len=*), INTENT(out)                        :: invmaskn, invorogn, invhursn, invhussn,   &
+      invqvsn, invuasn, invvasn, invtasn, invtdsn, invtsn, invsstn, invpsn, invpsln, invsndn, invcin, &
+      invtdan, invstl1n, tskextrap, invstl2n, invstl3n, invstl4n, invswvl1n, invswvl2n, invswvl3n,    &
+      invswvl4n, mrsosextrap
     CHARACTER(len=*), INTENT(out)                        :: inptua, inptva, inptta, inpttda, inpthur, &
       inpthus, inptqv, inptzg
     INTEGER, INTENT(out)                                 :: inNskiplev, p_top, maxtimediff, itpt,     &
@@ -2458,6 +3191,7 @@ MODULE module_ncwps
     inNskiplev = 0
     invmaskn = 'None'
     varVland = 'sst,1,-9999.,eq'
+    invorogn = 'None' 
     invhursn = 'None' 
     invhussn = 'None' 
     invqvsn = 'None' 
@@ -2501,6 +3235,7 @@ MODULE module_ncwps
     iconf%inNskiplev = 0
     iconf%invmaskn = 'None'
     iconf%varVland = 'sst,1,-9999.,eq'
+    iconf%invorogn = 'None' 
     iconf%invhursn = 'None' 
     iconf%invhussn = 'None' 
     iconf%invqvsn = 'None' 
@@ -2546,10 +3281,10 @@ MODULE module_ncwps
   END SUBROUTINE Init_values
 
   SUBROUTINE Init_proj(version, xfcst, map_source, iproj, is_wind_grid_rel, startloc, NLg,            &
-    lonres, latres, centlon, truelat1, truelat2, earth_radius, inprojvmask, inprojvhurs, inprojvhuss, &
-    inprojvqvs, inprojvuas, inprojvvas, inprojvtas, inprojvtds, inprojvts, inprojvsst, inprojvps,     &
-    inprojvpsl, inprojvsnd, inprojvci, inprojvua, inprojvva, inprojvta, inprojvtda, inprojvhur,       &
-    inprojvhus, inprojvqv, inprojvzg, inprojvstl1, inprojvstl2, inprojvstl3, inprojvstl4,             &
+    lonres, latres, centlon, truelat1, truelat2, earth_radius, inprojvmask, inprojvorog, inprojvhurs, &
+    inprojvhuss, inprojvqvs, inprojvuas, inprojvvas, inprojvtas, inprojvtds, inprojvts, inprojvsst,   &
+    inprojvps, inprojvpsl, inprojvsnd, inprojvci, inprojvua, inprojvva, inprojvta, inprojvtda,        &
+    inprojvhur, inprojvhus, inprojvqv, inprojvzg, inprojvstl1, inprojvstl2, inprojvstl3, inprojvstl4, &
     inprojvswvl1, inprojvswvl2, inprojvswvl3, inprojvswvl4,                                           &
     indtimen, indlatn, indlonn, indplevn, indmodlevn, invtimen, invlatn, invlonn, invplevn,           &
     invmodlevn, iconf)
@@ -2557,11 +3292,11 @@ MODULE module_ncwps
 
     IMPLICIT NONE
 
-    INTEGER, INTENT(out)                                 :: inprojvmask, inprojvhurs, inprojvhuss,    &
-      inprojvqvs, inprojvuas, inprojvvas, inprojvtas, inprojvtds, inprojvts, inprojvsst, inprojvps,   &
-      inprojvpsl, inprojvsnd, inprojvci, inprojvua, inprojvva, inprojvta, inprojvtda, inprojvhur,     &
-      inprojvhus, inprojvqv, inprojvzg, inprojvstl1, inprojvstl2, inprojvstl3, inprojvstl4,           &
-      inprojvswvl1,  inprojvswvl2, inprojvswvl3, inprojvswvl4
+    INTEGER, INTENT(out)                                 :: inprojvmask, inprojvorog, inprojvhurs,    &
+      inprojvhuss, inprojvqvs, inprojvuas, inprojvvas, inprojvtas, inprojvtds, inprojvts, inprojvsst, &
+      inprojvps, inprojvpsl, inprojvsnd, inprojvci, inprojvua, inprojvva, inprojvta, inprojvtda,      &
+      inprojvhur, inprojvhus, inprojvqv, inprojvzg, inprojvstl1, inprojvstl2, inprojvstl3,            &
+      inprojvstl4, inprojvswvl1, inprojvswvl2, inprojvswvl3, inprojvswvl4
     CHARACTER(len=32), DIMENSION(maxNprojs), INTENT(out) :: map_source
     CHARACTER(len=8), DIMENSION(maxNprojs), INTENT(out)  :: startloc
     INTEGER, DIMENSION(maxNprojs), INTENT(out)           :: version, iproj, NLg
@@ -2577,6 +3312,7 @@ MODULE module_ncwps
     fname = 'Init_proj'
 
     inprojvmask = 1
+    inprojvorog = 1
     inprojvhurs = 1
     inprojvhuss = 1
     inprojvqvs = 1
@@ -2631,6 +3367,7 @@ MODULE module_ncwps
     invmodlevn = 'None'
 
     iconf%inprojvmask = 1
+    iconf%inprojvorog = 1
     iconf%inprojvhurs = 1
     iconf%inprojvhuss = 1
     iconf%inprojvqvs = 1
@@ -2839,9 +3576,9 @@ MODULE module_ncwps
 
     fname = 'variable_units'
 
-    availvars = 'hgt, hur, hurs, hus, huss, landsea, mrsos, press, ps, psl, qv, qvs, ci, snow, ' //   &
-      'snowd, snowden, snowec, sst, stl1, stl2, stl3, stl4, swvl1, swvl2, swvl3, swvl4, ta, tas, ' // &
-      'tda, tds, tos, ts, tsl, uas, ua, vas, va, zg, zgs'
+    availvars = 'hgt, hur, hurs, hus, huss, landsea, mrsos, orog, pres, presb, press, ps, psl, ' //   &
+      'qv, qvs, ci, snow, snowd, snowden, snowec, sst, stl1, stl2, stl3, stl4, swvl1, swvl2, '//      &
+      'swvl3, swvl4, ta, tas, tda, tds, tos, ts, tsl, uas, ua, vas, va, zg, zgs'
 
     variable: SELECT CASE (TRIM(varn))
       CASE ('zg')
@@ -2886,6 +3623,12 @@ MODULE module_ncwps
         variable_units = 'm' // TRIM(Nstrings(' ',29))
       CASE ('hgt')
         variable_units = 'm' // TRIM(Nstrings(' ',29))
+      CASE ('orog')
+        variable_units = 'm' // TRIM(Nstrings(' ',29))
+      CASE ('pres')
+        variable_units = 'Pa' // TRIM(Nstrings(' ',28))
+      CASE ('presb')
+        variable_units = 'Pa' // TRIM(Nstrings(' ',28))
       CASE ('press')
         variable_units = 'Pa' // TRIM(Nstrings(' ',28))
       CASE ('ps')
@@ -2941,7 +3684,7 @@ MODULE module_ncwps
     CHARACTER(len=Ss), INTENT(out)                       :: LVarn, fieldn, units, description
 
     ! Local
-    CHARACTER(len=St), DIMENSION(38)                     :: availcfvarn
+    CHARACTER(len=St), DIMENSION(39)                     :: availcfvarn
     CHARACTER(len=Ss)                                    :: fname
 
 !!!!!!!! Variables
@@ -2959,37 +3702,38 @@ MODULE module_ncwps
     availcfvarn(5) = 'huss' // TRIM(Nstrings(' ',46))
     availcfvarn(6) = 'landsea' // TRIM(Nstrings(' ',43))
     availcfvarn(7) = 'mrsos' // TRIM(Nstrings(' ',45))
-    availcfvarn(8) = 'press' // TRIM(Nstrings(' ',45))
-    availcfvarn(9) = 'ps' // TRIM(Nstrings(' ',48))
-    availcfvarn(10) = 'psl' // TRIM(Nstrings(' ',47))
-    availcfvarn(11) = 'qv' // TRIM(Nstrings(' ',48))
-    availcfvarn(12) = 'qvs' // TRIM(Nstrings(' ',47))
-    availcfvarn(13) = 'ci' // TRIM(Nstrings(' ',48))
-    availcfvarn(14) = 'snow' // TRIM(Nstrings(' ',46))
-    availcfvarn(15) = 'snowd' // TRIM(Nstrings(' ',45))
-    availcfvarn(16) = 'snowden' // TRIM(Nstrings(' ',43))
-    availcfvarn(17) = 'snowec' // TRIM(Nstrings(' ',44))
-    availcfvarn(18) = 'sst' // TRIM(Nstrings(' ',47))
-    availcfvarn(19) = 'stl1' // TRIM(Nstrings(' ',46))
-    availcfvarn(20) = 'stl2' // TRIM(Nstrings(' ',46))
-    availcfvarn(21) = 'stl3' // TRIM(Nstrings(' ',46))
-    availcfvarn(22) = 'stl4' // TRIM(Nstrings(' ',46))
-    availcfvarn(23) = 'swvl1' // TRIM(Nstrings(' ',45))
-    availcfvarn(24) = 'swvl2' // TRIM(Nstrings(' ',45))
-    availcfvarn(25) = 'swvl3' // TRIM(Nstrings(' ',45))
-    availcfvarn(26) = 'swvl4' // TRIM(Nstrings(' ',45))
-    availcfvarn(27) = 'ta' // TRIM(Nstrings(' ',48))
-    availcfvarn(28) = 'tas' // TRIM(Nstrings(' ',47))
-    availcfvarn(29) = 'tda' // TRIM(Nstrings(' ',47))
-    availcfvarn(30) = 'tds' // TRIM(Nstrings(' ',47))
-    availcfvarn(31) = 'tos' // TRIM(Nstrings(' ',47))
-    availcfvarn(32) = 'ts' // TRIM(Nstrings(' ',48))
-    availcfvarn(33) = 'uas' // TRIM(Nstrings(' ',47))
-    availcfvarn(34) = 'ua' // TRIM(Nstrings(' ',48))
-    availcfvarn(35) = 'vas' // TRIM(Nstrings(' ',47))
-    availcfvarn(36) = 'va' // TRIM(Nstrings(' ',48))
-    availcfvarn(37) = 'zg' // TRIM(Nstrings(' ',48))
-    availcfvarn(38) = 'zgs' // TRIM(Nstrings(' ',47))
+    availcfvarn(8) = 'orog' // TRIM(Nstrings(' ',46))
+    availcfvarn(9) = 'press' // TRIM(Nstrings(' ',45))
+    availcfvarn(10) = 'ps' // TRIM(Nstrings(' ',48))
+    availcfvarn(11) = 'psl' // TRIM(Nstrings(' ',47))
+    availcfvarn(12) = 'qv' // TRIM(Nstrings(' ',48))
+    availcfvarn(13) = 'qvs' // TRIM(Nstrings(' ',47))
+    availcfvarn(14) = 'ci' // TRIM(Nstrings(' ',48))
+    availcfvarn(15) = 'snow' // TRIM(Nstrings(' ',46))
+    availcfvarn(16) = 'snowd' // TRIM(Nstrings(' ',45))
+    availcfvarn(17) = 'snowden' // TRIM(Nstrings(' ',43))
+    availcfvarn(18) = 'snowec' // TRIM(Nstrings(' ',44))
+    availcfvarn(19) = 'sst' // TRIM(Nstrings(' ',47))
+    availcfvarn(20) = 'stl1' // TRIM(Nstrings(' ',46))
+    availcfvarn(21) = 'stl2' // TRIM(Nstrings(' ',46))
+    availcfvarn(22) = 'stl3' // TRIM(Nstrings(' ',46))
+    availcfvarn(23) = 'stl4' // TRIM(Nstrings(' ',46))
+    availcfvarn(24) = 'swvl1' // TRIM(Nstrings(' ',45))
+    availcfvarn(25) = 'swvl2' // TRIM(Nstrings(' ',45))
+    availcfvarn(26) = 'swvl3' // TRIM(Nstrings(' ',45))
+    availcfvarn(27) = 'swvl4' // TRIM(Nstrings(' ',45))
+    availcfvarn(28) = 'ta' // TRIM(Nstrings(' ',48))
+    availcfvarn(29) = 'tas' // TRIM(Nstrings(' ',47))
+    availcfvarn(30) = 'tda' // TRIM(Nstrings(' ',47))
+    availcfvarn(31) = 'tds' // TRIM(Nstrings(' ',47))
+    availcfvarn(32) = 'tos' // TRIM(Nstrings(' ',47))
+    availcfvarn(33) = 'ts' // TRIM(Nstrings(' ',48))
+    availcfvarn(34) = 'uas' // TRIM(Nstrings(' ',47))
+    availcfvarn(35) = 'ua' // TRIM(Nstrings(' ',48))
+    availcfvarn(36) = 'vas' // TRIM(Nstrings(' ',47))
+    availcfvarn(37) = 'va' // TRIM(Nstrings(' ',48))
+    availcfvarn(38) = 'zg' // TRIM(Nstrings(' ',48))
+    availcfvarn(39) = 'zgs' // TRIM(Nstrings(' ',47))
 
     SELECT CASE(TRIM(cfvarn))
 
@@ -3034,6 +3778,12 @@ MODULE module_ncwps
         fieldn = 'MRSOS'
         units = 'kgm-2'
 
+      CASE ('orog')
+        Lvarn = 'Orography, height above geoide'
+        fieldn = 'SOILHGT'
+        units = 'm'
+        description = 'Orography'
+
       CASE ('ps')
         Lvarn = 'Surface Pressure'
         fieldn = 'PSFC'
@@ -3333,7 +4083,7 @@ MODULE module_ncwps
 
     fname = 'get_2Dfield'
 
-    CALL multisearch_var(dbg, ncfiles, ncids, TRIM(varname), Nfvar, ffilens, fncids)
+    CALL multisearch_var(dbg, fname, ncfiles, ncids, TRIM(varname), Nfvar, ffilens, fncids)
 
     IF (TRIM(vtimen) /= 'WRFtime') THEN
       CALL get_equivmultitimes(Nfvar, fncids(1:Nfvar), dtimen, vtimen, oDs, maxTdiff, ifile, ncid,    &
@@ -3376,6 +4126,8 @@ MODULE module_ncwps
     varvalues = newvarvalues
     varu = variable_units(CFvarn)
     CALL get_varattr(ncid, varname, 'units', 1, varinu)
+    IF (dbg) PRINT *,"      units of variable in file: '" // TRIM(varinu) // "' CF variable '" //     &
+      TRIM(CFvarn) // "' units: '" // TRIM(varinu) // "'"
     CALL equal_units3DR(varu, varinu, dx, dy, 1, varvalues, oper=op, factor=fact,                     &
       fillvalue=metfillvalue, newvals2=newvarvalues)
 
@@ -3425,7 +4177,7 @@ MODULE module_ncwps
 
     fname = 'get_3Dfield'
 
-    CALL multisearch_var(dbg, ncfiles, ncids, TRIM(varname), Nfvar, ffilens, fncids)
+    CALL multisearch_var(dbg, fname, ncfiles, ncids, TRIM(varname), Nfvar, ffilens, fncids)
 
     IF (TRIM(vtimen) /= 'WRFtime') THEN
       CALL get_equivmultitimes(Nfvar, fncids(1:Nfvar), dtimen, vtimen, oDs, maxTdiff, ifile, ncid,    &
@@ -3468,6 +4220,8 @@ MODULE module_ncwps
     varvalues = newvarvalues
     varu = variable_units(CFvarn)
     CALL get_varattr(ncid, varname, 'units', 1, varinu)
+    IF (dbg) PRINT *,"      units of variable in file: '" // TRIM(varinu) // "' CF variable '" //     &
+      TRIM(CFvarn) // "' units: '" // TRIM(varinu) // "'"
     CALL equal_units4DR(varu, varinu, dx, dy, dz, 1, varvalues, oper=op, factor=fact,                 &
       fillvalue=metfillvalue, newvals2=newvarvalues)
 
@@ -3513,7 +4267,7 @@ MODULE module_ncwps
     lon2D0 = 0.
     lon3D0 = 0.
 
-    ncid = search_var(ncfiles, ncids, TRIM(varlonn))
+    ncid = search_var(fname, ncfiles, ncids, TRIM(varlonn))
         
     lonrank = inq_var_rank(ncid, TRIM(varlonn))
     IF (lonrank == 1) THEN
@@ -3534,7 +4288,7 @@ MODULE module_ncwps
     lat2D0 = 0.
     lat3D0 = 0.
 
-    ncid = search_var(ncfiles, ncids, TRIM(varlatn))
+    ncid = search_var(fname, ncfiles, ncids, TRIM(varlatn))
         
     latrank = inq_var_rank(ncid, TRIM(varlatn))
     IF (latrank == 1) THEN
diff --git a/nc2wps/module_netcdf_utils.f90 b/nc2wps/module_netcdf_utils.f90
index 2d0ec2c8653b65d15a88adac3e88aaff6c5ec94d..3477791d1b95ac41564121c8feabd5570ce04c79 100644
--- a/nc2wps/module_netcdf_utils.f90
+++ b/nc2wps/module_netcdf_utils.f90
@@ -15,15 +15,20 @@ MODULE module_netcdf_utils
 ! check_var_slice: Function to check if the amount of values to retrieve from a variable meet the 
 !   shape of the variable
 ! compute_WRFgeop: Subroutine to compute geopotential values from WRF's PH & PHB variables
-! compute_WRFpress: Subroutine to compute pressure values from WRF's P & PB variables
+! compute_WRFpres: Subroutine to compute pressure values from WRF's P & PB variables
 ! compute_WRFswvl: Subroutine to compute the soil ground volumetric water from WRF to another set of 
 !   ground layers
 ! compute_WRFstl: Subroutine to compute the soil ground temperature from WRF to another set of ground
 !   depths
+! compute_WRFta: Subroutine to compute temperature values from WRF's T, P, PB variables
 ! compute_WRFtimes: Subroutine to compute time values from WRFtime variable
 ! getattr0D_invar: Subroutine to retrieve a given scalar attribute from a variable from a given netCDF 
 !   file
 ! get_equivmultitimes: Subroutine to provide the equivalent time-step from a seris of netCDF files
+! get_var_equivmultitimes: Subroutine to provide the equivalent time-step for a variable found in a 
+!   series of netCDF files at a given projection
+! get_var_equivmultiWRFtimes: Subroutine to provide the equivalent WRF time-step for a variable found 
+!   in a series of netCDF files at a given projection
 ! get_equivtimes: Subroutine to provide the equivalent time-step from a netCDF file 
 ! get_equivWRFtimes: Subroutine to provide the equivalent time-step from a WRF netCDF file 
 ! get_equivmultiWRFtimes: Subroutine to provide the equivalent time-step from a serie WRF netCDF files
@@ -63,6 +68,8 @@ MODULE module_netcdf_utils
 ! var[2/3/4]D_hur_p_ta_qv: Subroutine to compute 2/3/4D relative humidity following 
 !   'August - Roche - Magnus' formula
 ! var3D_qv_tda_pres: Subroutine to compute qv mixing ratio of water vapour from 3D td and pres
+! var_qv_rh: Subroutine to compute water vapour mixing ratio using August-Roche-Magnus approximation 
+!   from rh [1]
 ! write_ungrib2DRval: Subroutine to write 2D real data into file in ungrib format
 ! WRFtime_mat: Function to provide a matrix notation from a WRF type string date
 ! var_WRFtimes: Subroutine to transform from WRFtimes to CF-compilant time units
@@ -87,6 +94,7 @@ MODULE module_netcdf_utils
 ! freeunit: provides the number of a free unit in which open a file
 ! get_datetime: Subroutine to provide a date from a date-time String 
 !   [Y][cd][M][cd][D][cs][H][ct][M][ct][S]
+! same_shape[1/2/3/4]DR: Subroutine to determine if 2 real arrays of rank 1/2/3/4 have the same length
 ! Swithin_csvStr: Function to provide an integer value from within a csv string
 ! Iwithin_csvStr: Function to provide an integer value from within a csv string
 ! Rwithin_csvStr: Function to provide a real value from within a csv string
@@ -94,6 +102,7 @@ MODULE module_netcdf_utils
 ! Index1DArrayI: Function to provide the first index of a given value inside a 1D intger array
 ! Index1DArrayR: Function to provide the first index of a given value inside a 1D real array
 ! Isin1DC: Function to say wether a given value is inside a 1D character array
+! isInlistS: Funtion to check is a given string is in a list of String values
 ! IsMiss: Funciton to determine if a given value is missing vaue or near by
 ! ItoS: Function to transform an integer to String
 ! JD: Fucntion to compute the julian date (JD) given a gregorian calendar
@@ -111,6 +120,7 @@ MODULE module_netcdf_utils
 ! split: Subroutine which provides the values from a string [String] which has been split by a given 
 !   character [charv] a given number of values [Nvalues] is expected
 ! stoprun: Subroutine to stop running and print a message
+! stoprunfunc: Subroutine to stop running and print a message when function is called from another one
 ! stoprunAvail: Subroutine to stop running and print a message and showing available options
 
 ! SECTION -- section: netcdf
@@ -393,6 +403,8 @@ MODULE module_netcdf_utils
   SUBROUTINE modify4D_fillValue(ncid, varn, missvalue, d1, d2, d3, d4, values, newvalues)
   ! Subroutine to modify the value of the '_FillValue' and 'missing_value' attributes of a 4D variable
 
+    USE netcdf
+
     IMPLICIT NONE
 
     INTEGER, INTENT(in)                                  :: ncid, d1, d2, d3, d4
@@ -440,6 +452,8 @@ MODULE module_netcdf_utils
 
     DO i=1, Nmissv
       rcode = nf90_inquire_attribute(ncid, varid, fillmissns(i), xtype=xtype, len=Lattr)
+      ! Do nothing if the _FillValue or missing_Value does not exist as attribute
+      IF (rcode == NF90_ENOTATT) CYCLE
 
       IF (rcode == 0) THEN
 
@@ -487,6 +501,8 @@ MODULE module_netcdf_utils
   SUBROUTINE modify3D_fillValue(ncid, varn, missvalue, d1, d2, d3, values, newvalues)
   ! Subroutine to modify the value of the '_FillValue' and 'missing_value' attributes of a 3D variable
 
+    USE netcdf
+
     IMPLICIT NONE
 
     INTEGER, INTENT(in)                                  :: ncid, d1, d2, d3
@@ -533,6 +549,8 @@ MODULE module_netcdf_utils
 
     DO i=1, Nmissv
       rcode = nf90_inquire_attribute(ncid, varid, fillmissns(i), xtype=xtype, len=Lattr)
+      ! Do nothing if the _FillValue or missing_Value does not exist as attribute
+      IF (rcode == NF90_ENOTATT) CYCLE
       IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
 
       IF (rcode == 0) THEN
@@ -583,6 +601,8 @@ MODULE module_netcdf_utils
   SUBROUTINE modify2D_fillValue(ncid, varn, missvalue, d1, d2, values, newvalues)
   ! Subroutine to modify the value of the '_FillValue' and 'missing_value' attributes of a 2D variable
 
+    USE netcdf
+
     IMPLICIT NONE
 
     INTEGER, INTENT(in)                                  :: ncid, d1, d2
@@ -622,7 +642,9 @@ MODULE module_netcdf_utils
 
     DO i=1, Nmissv
       rcode = nf90_inquire_attribute(ncid, varid, fillmissns(i), xtype=xtype, len=Lattr)
-
+      ! Do nothing if the _FillValue or missing_Value does not exist as attribute
+      IF (rcode == NF90_ENOTATT) CYCLE
+      
       IF (rcode == 0) THEN
 
         IF (xtype /= NF90_FLOAT) THEN
@@ -662,7 +684,7 @@ MODULE module_netcdf_utils
 
   SUBROUTINE compute_extrapol_2varsm(id, dimx, dimy, dimt, vsinglen, dtimen, vmean, ncidmean,         &
     extraptype, Nnewlays, newlays, extrapv)
-  ! Subroutine to compute the extrapolation from a single evel variable to variable with set of layers
+  ! Subroutine to compute the extrapolation from a single level variable to variable with set of layers
   !   using an additional mean variable (no time dependency)
 
     IMPLICIT NONE
@@ -819,6 +841,9 @@ MODULE module_netcdf_utils
     END IF
 
     DEALLOCATE(singlevar)
+    IF (ALLOCATED(meanvar)) DEALLOCATE(meanvar)
+    IF (ALLOCATED(newmeanvar)) DEALLOCATE(newmeanvar)
+    IF (ALLOCATED(newsinglevar)) DEALLOCATE(newsinglevar)
     
     RETURN
 
@@ -936,38 +961,48 @@ MODULE module_netcdf_utils
         END DO
       END DO
     ELSE
-      msg = "Extrapolation '" // TRIM(extrapvals(2)) // "' not ready !!"
+      msg = "Extrapolation '" // TRIM(extraptype) // "' not ready !!"
       CALL stoprunAvail(fname, msg, Navailextraptype, availextraptype)
     END IF
 
     DEALLOCATE(singlevar)
+    IF (ALLOCATED(newsinglevar)) DEALLOCATE(newsinglevar)
     
     RETURN
 
   END SUBROUTINE compute_extrapol
 
-  SUBROUTINE compute_WRFswvl(id, dimx, dimy, dimt, Nnewlays, newlays, swvl)
+  SUBROUTINE compute_WRFswvl(nfs, ids, id, dimx, dimy, dimt, dimtn, Nnewlays, newlays, swvl)
   ! Subroutine to compute the soil ground volumetric water from WRF to another set of ground layers
 
     IMPLICIT NONE
 
-    INTEGER, INTENT(in)                                  :: id, dimx, dimy, dimt, Nnewlays
+    INTEGER, INTENT(in)                                  :: nfs, id, dimx, dimy, dimt, Nnewlays
+    CHARACTER(len=Sl), INTENT(in)                        :: dimtn
+    INTEGER, DIMENSION(nfs), INTENT(in)                  :: ids
     REAL, DIMENSION(2,Nnewlays), INTENT(in)              :: newlays
     REAL, DIMENSION(dimx, dimy, Nnewlays, dimt),                                                      &
      INTENT(out)                                         :: swvl
 
     ! Local
-    INTEGER                                              :: ix, iy, iz, it, dimz, dimt0
+    INTEGER                                              :: i, ix, iy, iz, it, dimz, dimt0
+    INTEGER                                              :: Nfvar, idzs, iddzs
     INTEGER, DIMENSION(2)                                :: istart2d
     INTEGER, DIMENSION(4)                                :: istart
+    INTEGER, DIMENSION(nfs)                              :: foundf, foundids
+    REAL, DIMENSION(:), ALLOCATABLE                      :: zvarvals
     REAL, DIMENSION(:,:), ALLOCATABLE                    :: zs, dzs, WRFlays
     REAL, DIMENSION(:,:,:,:), ALLOCATABLE                :: smois
     REAL, DIMENSION(3)                                   :: intpvals
+    CHARACTER(len=Sl)                                    :: invn
     CHARACTER(len=Sm)                                    :: fname
 
 !!!!!!! Variables
+! nfs: amount of open files
+! ids: ids of all the connections to the opened NetrCDF files
 ! id: number of connection to the NetCDF file
 ! dimx, dimy, dimt: dimensions of the WRF soil volumetric water content
+! dimtn: name of the temporal dimension
 ! WRFlays: WRF ground layers  [beginning, end]
 ! WRFwvsoil: WRF soil volumetric water content
 ! Nnewlays: Amount of new soil layers
@@ -976,25 +1011,77 @@ MODULE module_netcdf_utils
 
     fname = 'copute_WRFswvl'
 
-    ! Number of depths of WRF
-    CALL read_dimlength (id, 'soil_layers_stag', dimz)
-    CALL read_dimlength (id, 'Time', dimt0)
+    ! Looking for 'ZS' and 'DZS'
+    invn = 'ZS'
+    CALL multisearch_var(.FALSE., fname, nfs, ids, TRIM(invn), Nfvar, foundf, foundids)
+
+    ! Looking for the file with the right amount of temporal values
+    idzs = -1
+    DO i=1, Nfvar
+      CALL read_dimlength (foundids(i), dimtn, dimt0)
+      IF (dimt0 == dimt) THEN
+        idzs = foundids(i)
+        EXIT
+      END IF
+    END DO
+    IF (idzs == -1) THEN
+      PRINT *, TRIM(errormsg)
+      PRINT *, '  ' // TRIM(fname) // ": there is no file with 'ZS' variable with " // TRIM(ItoS(dimt))//&
+        " time steps !!"
+      PRINT *,"     Values found [id] [dimt] _______"
+      DO i=1, Nfvar
+        CALL read_dimlength (foundids(i), dimtn, dimt0)
+        PRINT *,'      ', foundids(i), dimt0
+      END DO
+      PRINT *,'FATAL ERROR'
+    END IF
+
+    invn = 'DZS'
+    CALL multisearch_var(.FALSE., fname, nfs, ids, TRIM(invn), Nfvar, foundf, foundids)
+    ! Looking for the file with the right amount of temporal values
+    iddzs = -1
+    DO i=1, Nfvar
+      CALL read_dimlength (foundids(i), dimtn, dimt0)
+      IF (dimt0 == dimt) THEN
+        iddzs = foundids(i)
+        ! Number of depths of WRF
+        CALL read_dimlength (foundids(i), 'soil_layers_stag', dimz)
+        EXIT
+      END IF
+    END DO
+    IF (iddzs == -1) THEN
+      PRINT *, TRIM(errormsg)
+      PRINT *, '  ' // TRIM(fname) // ": there is no file with 'DZS' variable with " // TRIM(ItoS(dimt))//&
+        " time steps !!"
+      PRINT *,"     Values found [id] [dimt] _______"
+      DO i=1, Nfvar
+        CALL read_dimlength (foundids(i), dimtn, dimt0)
+        PRINT *,'      ', foundids(i), dimt0
+      END DO
+      PRINT *,'FATAL ERROR'
+    END IF
 
     IF (ALLOCATED(zs)) DEALLOCATE(zs)
-    ALLOCATE(zs(dimz,dimt0))
+    ALLOCATE(zs(dimz,dimt))
     IF (ALLOCATED(dzs)) DEALLOCATE(dzs)
-    ALLOCATE(dzs(dimz,dimt0))
+    ALLOCATE(dzs(dimz,dimt))
     IF (ALLOCATED(WRFlays)) DEALLOCATE(WRFlays)
     ALLOCATE(WRFlays(2,dimz))
+    IF (ALLOCATED(zvarvals)) DEALLOCATE(zvarvals)
+    ALLOCATE(zvarvals(dimz))
 
     istart2d = (/ 1, 1 /)
-    CALL get_var2D_slice(id, dimz, dimt, istart2d, 'ZS', zs)
+    CALL get_var2D_slice(idzs, dimz, dimt, istart2d, 'ZS', zs)
     istart2d = (/ 1, 1 /)
-    CALL get_var2D_slice(id, dimz, dimt, istart2d, 'DZS', dzs)
+    CALL get_var2D_slice(iddzs, dimz, dimt, istart2d, 'DZS', dzs)
 
+    !!!! Check (NoahMP)
+    ! ZS "DEPTHS OF CENTERS OF SOIL LAYERS": 0.005, 0.02, 0.05, 0.11, 0.23
+    ! DZS "THICKNESSES OF SOIL LAYERS": 0.01, 0.02, 0.04, 0.08, 0.16
+    
     DO iz=1, dimz
-      WRFlays(1,iz) = zs(iz,1) - dzs(iz,1)
-      WRFlays(2,iz) = zs(iz,1) + dzs(iz,1)
+      WRFlays(1,iz) = zs(iz,1) - dzs(iz,1)/2.
+      WRFlays(2,iz) = zs(iz,1) + dzs(iz,1)/2
     END DO
     IF (ALLOCATED(smois)) DEALLOCATE(smois)
     ALLOCATE(smois(dimx,dimy,dimz,dimt))
@@ -1005,47 +1092,83 @@ MODULE module_netcdf_utils
     DO ix=1,dimx
       DO iy=1,dimy
         DO it=1,dimt
+          zvarvals = smois(ix,iy,:,it)
           DO iz=1, Nnewlays
-            swvl(ix,iy,iz,it)= linear_interp_densbars(dimz, WRFlays, smois(ix,iy,:,it), newlays(:,iz))
+            swvl(ix,iy,iz,it)= linear_interp_densbars(dimz, WRFlays, zvarvals, newlays(:,iz))
           END DO
         END DO
       END DO
     END DO
 
-    DEALLOCATE(zs)
-    DEALLOCATE(dzs)
-    DEALLOCATE(WRFlays)
-    DEALLOCATE(smois)
+    IF (ALLOCATED(zs)) DEALLOCATE(zs)
+    IF (ALLOCATED(dzs)) DEALLOCATE(dzs)
+    IF (ALLOCATED(WRFlays)) DEALLOCATE(WRFlays)
+    IF (ALLOCATED(smois)) DEALLOCATE(smois)
+    IF (ALLOCATED(zvarvals)) DEALLOCATE(zvarvals)
 
   END SUBROUTINE compute_WRFswvl
 
-  SUBROUTINE compute_WRFstl(id, dimx, dimy, dimt, Nnewdpths, newdpths, stl)
+  SUBROUTINE compute_WRFstl(nfs, ids, id, dimx, dimy, dimt, dimtn, Nnewdpths, newdpths, stl)
   ! Subroutine to compute the soil ground temperature from WRF to another set of ground depths
 
     IMPLICIT NONE
 
-    INTEGER, INTENT(in)                                  :: id, dimx, dimy, dimt, Nnewdpths
+    INTEGER, INTENT(in)                                  :: nfs, id, dimx, dimy, dimt, Nnewdpths
+    CHARACTER(len=Sl), INTENT(in)                        :: dimtn
+    INTEGER, DIMENSION(nfs), INTENT(in)                  :: ids
     REAL, DIMENSION(Nnewdpths), INTENT(in)               :: newdpths
     REAL, DIMENSION(dimx, dimy, Nnewdpths, dimt),                                                     &
      INTENT(out)                                         :: stl
 
     ! Local
-    INTEGER                                              :: ix, iy, iz, it, dimz
+    INTEGER                                              :: i, ix, iy, iz, it, dimz, dimt0
+    INTEGER                                              :: Nfvar, idzs
     INTEGER, DIMENSION(2)                                :: istart2d
     INTEGER, DIMENSION(4)                                :: istart
+    INTEGER, DIMENSION(nfs)                              :: foundf, foundids
+    REAL, DIMENSION(:), ALLOCATABLE                      :: zvarvals
     REAL, DIMENSION(:,:), ALLOCATABLE                    :: zs
     REAL, DIMENSION(:,:,:,:), ALLOCATABLE                :: tslb
     REAL, DIMENSION(3)                                   :: intpvals
+    CHARACTER(len=Sl)                                    :: invn
     CHARACTER(len=Sm)                                    :: fname
 
 !!!!!!! Variables
-! id: number of connection to the NetCDF file with 'DZS' and 'TSLB' variables
+! nfs: amount of open files
+! ids: ids of all the connections to the opened NetrCDF files
+! id: number of connection to the NetCDF file with 'TSLB' variable
 ! dimx, dimy, dimt: dimensions of WRF data
+! dimtn: name of the temporal dimension
 ! Nnewdpths: Amount of new soil depths
 ! newdpths: values of the new soil depths
 ! stl: soil temperature at the new depths
 
     fname = 'compute_WRFstl'
+    
+    ! Looking for 'ZS'
+    invn = 'ZS'
+    CALL multisearch_var(.FALSE., fname, nfs, ids, TRIM(invn), Nfvar, foundf, foundids)
+
+    ! Looking for the file with the right amount of temporal values
+    idzs = -1
+    DO i=1, Nfvar 
+      CALL read_dimlength (foundids(i), dimtn, dimt0)
+      IF (dimt0 == dimt) THEN
+        idzs = foundids(i)
+        EXIT
+      END IF
+    END DO
+    IF (idzs == -1) THEN
+      PRINT *, TRIM(errormsg)
+      PRINT *, '  ' // TRIM(fname) // ": there is no file with 'ZS' variable with " // TRIM(ItoS(dimt))//&
+        " time steps !!"
+      PRINT *,"     Values found [id] [dimt] _______"
+      DO i=1, Nfvar 
+        CALL read_dimlength (foundids(i), dimtn, dimt0)
+        PRINT *,'      ', foundids(i), dimt0
+      END DO
+      PRINT *,'FATAL ERROR'
+    END IF
 
     ! Number of depths of WRF
     CALL read_dimlength (id, 'soil_layers_stag', dimz)
@@ -1054,17 +1177,20 @@ MODULE module_netcdf_utils
     ALLOCATE(zs(dimz,dimt))
     IF (ALLOCATED(tslb)) DEALLOCATE(tslb)
     ALLOCATE(tslb(dimx,dimy,dimz,dimt))
+    IF (ALLOCATED(zvarvals)) DEALLOCATE(zvarvals)
+    ALLOCATE(zvarvals(dimz))
 
     istart2d = (/ 1, 1 /)
-    CALL get_var2D_slice(id, dimz, dimt, istart2d, 'ZS', zs)
+    CALL get_var2D_slice(idzs, dimz, dimt, istart2d, 'ZS', zs)
     istart = (/ 1, 1, 1, 1 /)
-    CALL get_var4D_slice(id, dimx, dimy, dimz, dimt, istart, 'TSLB', tslb)
+    CALL get_var4D_slice(id, dimx, dimy, dimz, dimt, istart, 'TSLB', tslb) 
 
     DO ix=1,dimx
       DO iy=1,dimy
         DO it=1,dimt
+          zvarvals = tslb(ix,iy,:,it)
           DO iz=1, Nnewdpths
-            intpvals = linear_interp1D(dimz, zs(:,1), tslb(ix,iy,:,it), newdpths(iz))
+            intpvals = linear_interp1D(dimz, zs(:,1), zvarvals, newdpths(iz))
             stl(ix,iy,iz,it) = intpvals(1)
           END DO
         END DO
@@ -1073,10 +1199,11 @@ MODULE module_netcdf_utils
 
     DEALLOCATE(zs)
     DEALLOCATE(tslb)
+    DEALLOCATE(zvarvals)
 
   END SUBROUTINE compute_WRFstl
 
-  SUBROUTINE compute_WRFpress(id, dimx, dimy, dimz, dimt, press)
+  SUBROUTINE compute_WRFpres(id, dimx, dimy, dimz, dimt, press)
   ! Subroutine to compute pressure values from WRF's P & PB variables
 
     USE netcdf
@@ -1097,7 +1224,7 @@ MODULE module_netcdf_utils
 ! dimx, dimy, dimz, dimt: size of values
 ! press: pressure values
 
-    fname = 'compute_WRFpress'
+    fname = 'compute_WRFpres'
 
     rcode = nf90_inq_varid(id, 'P', varid)
     IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
@@ -1111,7 +1238,7 @@ MODULE module_netcdf_utils
 
     press = p + pb
 
-  END SUBROUTINE compute_WRFpress
+  END SUBROUTINE compute_WRFpres
 
   SUBROUTINE compute_WRFgeop(id, dimx, dimy, dimz, dimt, geop)
   ! Subroutine to compute geopotential values from WRF's PH & PHB variables
@@ -1185,6 +1312,65 @@ MODULE module_netcdf_utils
 
   END SUBROUTINE compute_WRFtimes
 
+  SUBROUTINE compute_WRFta(id, dimx, dimy, dimz, dimt, ta)
+  ! Subroutine to compute temperature values from WRF's T, P, PB variables
+
+    USE netcdf
+
+    IMPLICIT NONE
+
+    INTEGER, INTENT(in)                                  :: id, dimx, dimy, dimz, dimt
+    REAL, DIMENSION(dimx,dimy,dimz,dimt), INTENT(out)    :: ta
+
+    ! Local
+    INTEGER                                              :: i,j,k,l
+    INTEGER                                              :: rcode, varid
+    INTEGER, DIMENSION(4)                                :: istart
+    REAL, DIMENSION(dimx,dimy,dimz,dimt)                 :: tapot, p, pb, pres
+    CHARACTER(len=Sm)                                    :: fname
+
+!!!!!!! Variables
+! id: unit number to the netCDF file
+! dimx, dimy, dimz, dimt: size of values
+! ta: air temperature values
+
+    fname = 'compute_WRFta'
+
+    ta = Rfillvalue
+
+    rcode = nf90_inq_varid(id, 'T', varid)
+    IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
+    rcode = nf90_inq_varid(id, 'P', varid)
+    IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
+    rcode = nf90_inq_varid(id, 'PB', varid)
+    IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
+
+    istart = (/ 1, 1, 1, 1 /)
+    CALL get_var4D_slice(id, dimx, dimy, dimz, dimt, istart, 'T', tapot)
+    CALL get_var4D_slice(id, dimx, dimy, dimz, dimt, istart, 'P', p)
+    CALL get_var4D_slice(id, dimx, dimy, dimz, dimt, istart, 'PB', pb)
+
+    tapot = tapot + 300.
+    pres = p + pb
+    ta = tapot*(pres/p0)**(rcp)
+    
+    DO i=1,dimx
+      DO j=1,dimy
+        DO k=1,dimz
+          DO l=1,dimt
+            IF (ta(i,j,k,l) <= epsilonv) THEN
+              PRINT *,'  0.0 found !!'
+              PRINT *,i,j,k,l,'    tapot:', tapot(i,j,k,l), ' pres:', pres(i,j,k,l), ' ta:', ta(i,j,k,l)
+            END IF
+          END DO
+        END DO
+      END DO
+    END DO
+
+    RETURN
+
+  END SUBROUTINE compute_WRFta
+
   SUBROUTINE get_varattr_nfiles(dbg, ncfiles, ncids, varn, attrn, Nattrv, attrv)
   ! Subroutine to get an attribute from avariable looking within mutliple netCDF files
 
@@ -1214,7 +1400,7 @@ MODULE module_netcdf_utils
 
     fname = 'get_varattr_nfiles'
 
-    CALL multisearch_var(dbg, ncfiles, ncids, TRIM(varn), Nfvar, ffilens, fncids)
+    CALL multisearch_var(dbg, fname, ncfiles, ncids, TRIM(varn), Nfvar, ffilens, fncids)
     
     ! Getting just the first one
     ncid = fncids(1)
@@ -1244,6 +1430,8 @@ MODULE module_netcdf_utils
     IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
     !PRINT *,'  ' // TRIM(fname) // ": attr '" // TRIM(attrv) // "'"
 
+    DEALLOCATE(readattrv)
+
     RETURN
 
   END SUBROUTINE get_varattr_nfiles
@@ -1282,6 +1470,9 @@ MODULE module_netcdf_utils
 
     ! ...  get the length of the "valid_range" attribute...
     rcode = nf90_inquire_attribute(ncid, varid, attrn, Lattrv)
+    ! Equivalencies at netcdf90/f90/netcdf_constants.f90
+    IF (rcode == NF90_ENOTATT) PRINT *, '  ' // TRIM(fname) // ": attribute '" // TRIM(attrn) //        &
+      "' not found in variable '" // TRIM(varn) // "'"
     IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
 
     !PRINT *, TRIM(fname) // ': Lattrv:', Lattrv
@@ -1298,6 +1489,8 @@ MODULE module_netcdf_utils
     IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
     !PRINT *,'  ' // TRIM(fname) // ": attr '" // TRIM(attrv) // "'"
 
+    DEALLOCATE(readattrv)
+
     RETURN
 
   END SUBROUTINE get_varattr
@@ -1347,6 +1540,8 @@ MODULE module_netcdf_utils
 
     IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
 
+    DEALLOCATE(readattrv)
+
     RETURN
 
   END SUBROUTINE get_varattrI
@@ -1396,6 +1591,8 @@ MODULE module_netcdf_utils
 
     IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
 
+    DEALLOCATE(readattrv)
+
     RETURN
 
   END SUBROUTINE get_varattrR
@@ -1688,7 +1885,7 @@ MODULE module_netcdf_utils
 
   END SUBROUTINE get_var1D_slice
 
-  INTEGER FUNCTION search_var(Nncids, ncids, vname)
+  INTEGER FUNCTION search_var(funcname, Nncids, ncids, vname)
 ! Function to provide at which netCDF connector a variable is found
 
     USE netcdf
@@ -1697,7 +1894,7 @@ MODULE module_netcdf_utils
 
     INTEGER, INTENT(IN)                                  :: Nncids
     INTEGER, DIMENSION(Nncids), INTENT(IN)               :: ncids
-    CHARACTER(LEN=*), INTENT(IN)                         :: vname
+    CHARACTER(LEN=*), INTENT(IN)                         :: vname, funcname
   
 ! Local
     INTEGER                                              :: i, j, Nvars, inc, varid, rcode
@@ -1706,6 +1903,7 @@ MODULE module_netcdf_utils
     CHARACTER(len=Sm)                                    :: fname
 
 !!!!!!! Variables
+! funcname: name of the function from which this function is used
 ! Nncid: number of netCDF connections
 ! ncid: vector with netCDF file identifier
 ! vname: name of the variable
@@ -1727,12 +1925,12 @@ MODULE module_netcdf_utils
         PRINT *, inc, 'In ncid', ncids(inc), ' variables:',((TRIM(varns(j)) // ', '), j=1, Nvars)
       END DO
       msg = "Variable '" // TRIM(vname) // "' not found !!"
-      CALL stoprun(msg, fname)
+      CALL stoprunfunc(msg, funcname, fname)
     END IF
 
   END FUNCTION search_var
 
-  SUBROUTINE multisearch_var(dbg, Nncids, ncids, vname, Nncid, foundfiles, foundncids)
+  SUBROUTINE multisearch_var(dbg, funcname, Nncids, ncids, vname, Nncid, foundfiles, foundncids)
 ! Subroutine to provide at which netCDF connectors a variable is found
 
     USE netcdf
@@ -1742,7 +1940,7 @@ MODULE module_netcdf_utils
     LOGICAL, INTENT(in)                                  :: dbg
     INTEGER, INTENT(IN)                                  :: Nncids
     INTEGER, DIMENSION(Nncids), INTENT(IN)               :: ncids
-    CHARACTER(LEN=*), INTENT(IN)                         :: vname
+    CHARACTER(LEN=*), INTENT(IN)                         :: funcname, vname
     INTEGER, INTENT(out)                                 :: Nncid
     INTEGER, DIMENSION(Nncids), INTENT(out)              :: foundfiles, foundncids
   
@@ -1753,6 +1951,7 @@ MODULE module_netcdf_utils
     CHARACTER(len=Sm)                                    :: fname
 
 !!!!!!! Variables
+! funcname: variable from which is called
 ! Nncid: number of netCDF connections
 ! ncid: vector with netCDF file identifier
 ! vname: name of the variable
@@ -1779,7 +1978,7 @@ MODULE module_netcdf_utils
         PRINT *, inc, 'In ncid', ncids(inc), ' variables:',((TRIM(varns(j)) // ', '), j=1, Nvars)
       END DO
       msg = "Variable '" // TRIM(vname) // "' not found !!"
-      CALL stoprun(msg, fname)
+      CALL stoprunfunc(msg, funcname, fname)
     END IF
 
     IF (dbg) THEN
@@ -1878,6 +2077,8 @@ MODULE module_netcdf_utils
       varns(i) = vname
     END DO
 
+    DEALLOCATE(varids)
+
   END SUBROUTINE all_vars
 
   SUBROUTINE all_dims(ncid, Ndims, dimns)
@@ -1917,6 +2118,8 @@ MODULE module_netcdf_utils
       dimns(i) = dname
     END DO
 
+    DEALLOCATE(dimids)
+
   END SUBROUTINE all_dims
 
   SUBROUTINE get_var4D(ncid, d1, d2, d3, d4, vname, vals)
@@ -1933,8 +2136,13 @@ MODULE module_netcdf_utils
 ! Local
     INTEGER                                              :: funit, i, idvarnew, ios
     INTEGER                                              :: Nvals, rcode, varid
+    INTEGER                                              :: dim1, dim2, dim3, dim4
+    INTEGER, DIMENSION(4)                                :: dimids
     CHARACTER(len=Sg)                                    :: line
     CHARACTER(len=Sl), DIMENSION(6)                      :: valsline
+    REAL, DIMENSION(:,:,:,:), ALLOCATABLE                :: arraytest
+    LOGICAL                                              :: testres
+    CHARACTER(len=Sm)                                    :: ivarn1,ivarn2
     CHARACTER(len=Sm)                                    :: fname
 
 !!!!!!! Variables
@@ -1947,10 +2155,31 @@ MODULE module_netcdf_utils
 
     rcode = nf90_inq_varid(ncid, vname, varid)
     IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
+    
+    rcode = nf90_inquire_variable(ncid, varid, dimids=dimids)
+    IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
+
+    rcode = nf90_inquire_dimension(ncid, dimids(1), len = dim1)
+    IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
+    rcode = nf90_inquire_dimension(ncid, dimids(2), len = dim2)
+    IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
+    rcode = nf90_inquire_dimension(ncid, dimids(3), len = dim3)
+    IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
+    rcode = nf90_inquire_dimension(ncid, dimids(4), len = dim4)
+    IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
+
+    ALLOCATE(arraytest(dim1,dim2,dim3,dim4))
+    ivarn1 = 'destiny array'
+    ivarn2 = 'source in file'
+    CALL same_shape4DR(d1,d2,d3,d4,dim1,dim2,dim3,dim4,vals,arraytest,ivarn1,ivarn2,.TRUE.,testres)
 
     rcode = nf90_get_var(ncid, varid, vals)          
     IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
 
+    DEALLOCATE(arraytest)
+
+    RETURN
+
   END SUBROUTINE get_var4D
 
   SUBROUTINE get_var3D(ncid, d1, d2, d3, vname, vals)
@@ -1967,8 +2196,13 @@ MODULE module_netcdf_utils
 ! Local
     INTEGER                                              :: funit, i, idvarnew, ios
     INTEGER                                              :: Nvals, rcode, varid
+    INTEGER                                              :: dim1, dim2, dim3
+    INTEGER, DIMENSION(3)                                :: dimids
     CHARACTER(len=Sg)                                    :: line
     CHARACTER(len=Sl), DIMENSION(6)                      :: valsline
+    REAL, DIMENSION(:,:,:), ALLOCATABLE                  :: arraytest
+    LOGICAL                                              :: testres
+    CHARACTER(len=Sm)                                    :: ivarn1,ivarn2
     CHARACTER(len=Sm)                                    :: fname
 
 !!!!!!! Variables
@@ -1981,10 +2215,28 @@ MODULE module_netcdf_utils
 
     rcode = nf90_inq_varid(ncid, vname, varid)
     IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
+    rcode = nf90_inquire_variable(ncid, varid, dimids=dimids)
+    IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
+
+    rcode = nf90_inquire_dimension(ncid, dimids(1), len = dim1)
+    IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
+    rcode = nf90_inquire_dimension(ncid, dimids(2), len = dim2)
+    IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
+    rcode = nf90_inquire_dimension(ncid, dimids(3), len = dim3)
+    IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
+
+    ALLOCATE(arraytest(dim1,dim2,dim3))
+    ivarn1 = 'destiny array'
+    ivarn2 = 'source in file'
+    CALL same_shape3DR(d1,d2,d3,dim1,dim2,dim3,vals,arraytest,ivarn1,ivarn2,.TRUE.,testres)
 
     rcode = nf90_get_var(ncid, varid, vals)          
     IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
 
+    DEALLOCATE(arraytest)
+    
+    RETURN
+
   END SUBROUTINE get_var3D
 
   SUBROUTINE get_var2D(ncid, d1, d2, vname, vals)
@@ -2001,8 +2253,13 @@ MODULE module_netcdf_utils
 ! Local
     INTEGER                                              :: funit, i, idvarnew, ios
     INTEGER                                              :: Nvals, rcode, varid
+    INTEGER                                              :: dim1, dim2
+    INTEGER, DIMENSION(2)                                :: dimids
     CHARACTER(len=Sg)                                    :: line
     CHARACTER(len=Sl), DIMENSION(6)                      :: valsline
+    REAL, DIMENSION(:,:), ALLOCATABLE                    :: arraytest
+    LOGICAL                                              :: testres
+    CHARACTER(len=Sm)                                    :: ivarn1,ivarn2
     CHARACTER(len=Sm)                                    :: fname
 
 !!!!!!! Variables
@@ -2015,10 +2272,26 @@ MODULE module_netcdf_utils
 
     rcode = nf90_inq_varid(ncid, vname, varid)
     IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
+    rcode = nf90_inquire_variable(ncid, varid, dimids=dimids)
+    IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
+
+    rcode = nf90_inquire_dimension(ncid, dimids(1), len = dim1)
+    IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
+    rcode = nf90_inquire_dimension(ncid, dimids(2), len = dim2)
+    IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
+
+    ALLOCATE(arraytest(dim1,dim2))
+    ivarn1 = 'destiny array'
+    ivarn2 = 'source in file'
+    CALL same_shape2DR(d1,d2,dim1,dim2,vals,arraytest,ivarn1,ivarn2,.TRUE.,testres)
 
     rcode = nf90_get_var(ncid, varid, vals)          
     IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
 
+    DEALLOCATE(arraytest)
+
+    RETURN
+
   END SUBROUTINE get_var2D
 
   SUBROUTINE get_var1D(ncid, d1, vname, vals)
@@ -2035,8 +2308,13 @@ MODULE module_netcdf_utils
 ! Local
     INTEGER                                              :: funit, i, idvarnew, ios
     INTEGER                                              :: Nvals, rcode, varid
+    INTEGER                                              :: dim1
+    INTEGER, DIMENSION(1)                                :: dimids
     CHARACTER(len=Sg)                                    :: line
     CHARACTER(len=Sl), DIMENSION(6)                      :: valsline
+    REAL, DIMENSION(:), ALLOCATABLE                      :: arraytest
+    LOGICAL                                              :: testres
+    CHARACTER(len=Sm)                                    :: ivarn1, ivarn2
     CHARACTER(len=Sm)                                    :: fname
 
 !!!!!!! Variables
@@ -2049,10 +2327,24 @@ MODULE module_netcdf_utils
 
     rcode = nf90_inq_varid(ncid, vname, varid)
     IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
+    rcode = nf90_inquire_variable(ncid, varid, dimids=dimids)
+    IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
+
+    rcode = nf90_inquire_dimension(ncid, dimids(1), len = dim1)
+    IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
+
+    ALLOCATE(arraytest(dim1))
+    ivarn1 = 'destiny array'
+    ivarn2 = 'source in file'
+    CALL same_shape1DR(d1,dim1,vals,arraytest,ivarn1,ivarn2,.TRUE.,testres)
 
     rcode = nf90_get_var(ncid, varid, vals)          
     IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
 
+    DEALLOCATE(arraytest)
+
+    RETURN
+
   END SUBROUTINE get_var1D
 
   LOGICAL FUNCTION isdim_inncid(incid, dimname)
@@ -2107,7 +2399,7 @@ MODULE module_netcdf_utils
     CHARACTER(LEN=*), INTENT(in)                         :: filename, dimname
 
 ! Local
-    INTEGER                                              :: nid, did, Ndims
+    INTEGER                                              :: nid, iid, Ndims
     INTEGER                                              :: rcode
     CHARACTER(len=Sg)                                    :: diminfile
     CHARACTER(len=Ss)                                    :: fname
@@ -2126,8 +2418,8 @@ MODULE module_netcdf_utils
     rcode = nf90_inquire(nid, Ndims)
     IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
 
-    Do nid=1, Ndims
-      rcode = nf90_inquire_dimension(nid, nid, name=diminfile)
+    DO iid=1, Ndims
+      rcode = nf90_inquire_dimension(nid, iid, name=diminfile)
       IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
       IF (TRIM(diminfile) == TRIM(dimname)) THEN
         isdim_infile = .TRUE.
@@ -2167,6 +2459,7 @@ MODULE module_netcdf_utils
     fname = 'isin_file'
 
 ! Opening creation status
+
     rcode = nf90_open(TRIM(filename), NF90_NOWRITE, nid)
     IF (rcode /= NF90_NOERR) CALL handle_err(rcode, fname)
 
@@ -2303,8 +2596,13 @@ MODULE module_netcdf_utils
       convtosec=86400.0
     ENDIF
     tmpatt =TRIM(tmpatt(INDEX(tmpatt,'since')+6:LEN_TRIM(tmpatt)))
-
-    CALL get_datetime(tmpatt, '-', ' ', ':', iiDT)
+    
+    IF (INDEX(tmpatt,'T') > 0) THEN
+      ! Date as [YYYY]-[MM]-[DD]T[HH]:[MI]:[SS]
+      CALL get_datetime(tmpatt, '-', 'T', ':', iiDT)
+    ELSE
+      CALL get_datetime(tmpatt, '-', ' ', ':', iiDT)
+    END IF
 
     sec0RK = iiDT(4)*3600. + iiDT(5)*60. + iiDT(6)
     !PRINT*, 'TOTAL SECONDS = ',sec0RK
@@ -2446,7 +2744,7 @@ MODULE module_netcdf_utils
   END SUBROUTINE get_equivtimes
 
   SUBROUTINE get_equivmultitimes(Nnc, ncids, indtimen, invtimen, obstime, maxTdiff, inc, ncid, ncit, dbg)
-  ! Subroutine to provide the equivalent time-step from a seris of netCDF files
+  ! Subroutine to provide the equivalent time-step from a series of netCDF files
 
     IMPLICIT NONE
 
@@ -2550,6 +2848,140 @@ MODULE module_netcdf_utils
     RETURN
 
   END SUBROUTINE get_equivmultitimes
+  
+  SUBROUTINE get_var_equivmultitimes(dbg, icnf, varn, iproj, obstime, maxTdiff, inc, ncid, ncit,      &
+    foundfilen)
+  ! Subroutine to provide the equivalent time-step for a variable found in a series of netCDF files at
+  !   a given projection
+
+    IMPLICIT NONE
+
+    TYPE(infconfig), INTENT(in)                          :: icnf
+    INTEGER, INTENT(in)                                  :: iproj, maxTdiff
+    CHARACTER(len=St), INTENT(in)                        :: varn
+    INTEGER, DIMENSION(6), INTENT(in)                    :: obstime
+    LOGICAL, OPTIONAL, INTENT(in)                        :: dbg
+    INTEGER, INTENT(out)                                 :: inc, ncid, ncit
+    CHARACTER(len=Sl), INTENT(out)                       :: foundfilen
+
+    ! Local
+    INTEGER                                              :: ifile, it
+    INTEGER                                              :: timelen
+    REAL, DIMENSION(:), ALLOCATABLE                      :: time
+    INTEGER, DIMENSION(6)                                :: intime
+    INTEGER, DIMENSION(:,:), ALLOCATABLE                 :: intimemat
+    CHARACTER(len=St)                                    :: indtimen, invtimen
+    CHARACTER(len=4)                                     :: cyy
+    CHARACTER(len=2)                                     :: cmm, cdd, chh, chh1, mii, sii
+    REAL(r_k)                                            :: RK1, RK2, jud1, jud2
+    LOGICAL                                              :: db
+    CHARACTER(len=Sm)                                    :: fname
+
+!!!!!!! Variables
+! icnf: structure with all the information about files, variables and their projections
+! obstime: matrix representation of the date to search equivalency
+! maxTdiff: allowed maximum time-difference in seconds to check for same times
+! inc: temporal value in the file
+! ncid: netCDF unit where the time is found
+! ncit: equivalent time-step from netCDF file
+
+    fname = 'get_var_equivmultitimes'
+
+    db = .FALSE.
+    IF (PRESENT(dbg)) db = dbg
+
+    ! Looping in files with the same projection
+    DO inc=1, icnf%inNpfile(iproj)
+
+      IF (isin_file(icnf%inprojfilen(iproj,inc), varn)) THEN
+
+        indtimen = icnf%indtimen(iproj)
+        invtimen = icnf%invtimen(iproj)
+      
+        ncid = -1
+        ncit = -1
+
+        CALL read_dimlength (icnf%inprojncid(iproj,inc), TRIM(indtimen), timelen)
+
+        IF (ALLOCATED(time)) DEALLOCATE(time)
+        ALLOCATE(time(timelen))
+        IF (ALLOCATED(intimemat)) DEALLOCATE(intimemat)
+        ALLOCATE(intimemat(6,timelen))
+
+        CALL get_var1D(icnf%inprojncid(iproj,inc), timelen, invtimen, time)
+
+        CALL transform_ncdates(icnf%inprojncid(iproj,inc), timelen, invtimen, time, intimemat, db)
+
+        ncit = -1
+        DO it=1,timelen
+          intime = intimemat(:,it)
+
+          IF (same_datetime(intime, obstime, maxTdiff)) THEN
+            ncit = it
+            ncid = icnf%inprojncid(iproj,inc)
+            foundfilen = icnf%inprojfilen(iproj,inc)
+            IF (dbg) THEN
+              WRITE(cyy,'(i4.4)') obstime(1)
+              WRITE(cmm,'(i2.2)') obstime(2)
+              WRITE(cdd,'(i2.2)') obstime(3)
+              WRITE(chh1,'(i2.2)') obstime(4)
+              WRITE(mii,'(i2.2)') obstime(5)
+              WRITE(sii,'(i2.2)') obstime(6)
+              PRINT *, '  ' // TRIM(fname) // ": in projection " // ItoS(iproj) // "' variable '" //  &
+                TRIM(varn) // "' at time step: " // cyy // '/' // cmm // '/' // cdd // " " // chh1 // &
+                ":" // mii // ":" // sii // " found in file '" //TRIM(foundfilen) // "' unit: " //    &
+               ItoS(ncid) // " time-step: " // ItoS(ncit)
+            END IF
+            EXIT
+          END IF
+        END DO
+
+      END IF
+
+      IF (ncid /= -1) EXIT
+    END DO
+    
+    IF (ncit == -1) THEN
+      WRITE(cyy,'(i4.4)') obstime(1)
+      WRITE(cmm,'(i2.2)') obstime(2)
+      WRITE(cdd,'(i2.2)') obstime(3)
+      WRITE(chh1,'(i2.2)') obstime(4)
+      WRITE(mii,'(i2.2)') obstime(5)
+      WRITE(sii,'(i2.2)') obstime(6)
+      msg = " No equivalence found for date '" // cyy // cmm // cdd // chh1 // mii // sii // "'"      &
+        // " and variable '" // TRIM(varn) // "' in projection: " // ItoS(iproj) // "!!" 
+      DO inc=1, icnf%inNpncids(iproj)
+        CALL read_dimlength (icnf%inprojncid(iproj,inc), TRIM(indtimen), timelen)
+
+        IF (ALLOCATED(time)) DEALLOCATE(time)
+        ALLOCATE(time(timelen))
+        IF (ALLOCATED(intimemat)) DEALLOCATE(intimemat)
+        ALLOCATE(intimemat(6,timelen))
+
+        CALL get_var1D(icnf%inprojncid(iproj,inc), timelen, invtimen, time)
+        CALL transform_ncdates(icnf%inprojncid(iproj,inc), timelen, invtimen, time, intimemat)
+
+        PRINT *,'  Time in file _______', inc, ' id', icnf%inprojncid(iproj,inc)
+        DO it=1,timelen 
+          intime = intimemat(:,it)
+          WRITE(cyy,'(i4.4)') intime(1)
+          WRITE(cmm,'(i2.2)') intime(2)
+          WRITE(cdd,'(i2.2)') intime(3)
+          WRITE(chh1,'(i2.2)') intime(4)
+          WRITE(mii,'(i2.2)') intime(5)
+          WRITE(sii,'(i2.2)') intime(6)
+          PRINT *,'    ',it, ': ',  cyy // cmm // cdd // chh1 // mii // sii 
+        END DO
+      END DO
+      CALL stoprun(msg, fname)
+    END IF 
+
+    IF (ALLOCATED(time)) DEALLOCATE(time)
+    IF (ALLOCATED(intimemat)) DEALLOCATE(intimemat)
+
+    RETURN
+
+  END SUBROUTINE get_var_equivmultitimes
 
   SUBROUTINE get_equivWRFtimes(ncid, obstime, ncit, maxTdiff)
   ! Subroutine to provide the equivalent time-step from a WRF netCDF file 
@@ -2627,13 +3059,14 @@ MODULE module_netcdf_utils
     INTEGER, INTENT(out)                                 :: inc, ncid, ncit
 
     ! Local
-    INTEGER                                              :: it
+    INTEGER                                              :: it, ic
     INTEGER                                              :: rcode, varid
     INTEGER                                              :: timelen
     INTEGER, DIMENSION(2)                                :: istart
     CHARACTER(len=1), DIMENSION(:,:), ALLOCATABLE        :: wrftime
     CHARACTER(len=4)                                     :: cyy
     CHARACTER(len=2)                                     :: cmm, cdd, chh, chh1, mii, sii
+    CHARACTER(len=19)                                    :: dateS
     CHARACTER(len=Su)                                    :: indtimen, invtimen
     CHARACTER(len=Sm)                                    :: fname
 
@@ -2652,6 +3085,7 @@ MODULE module_netcdf_utils
     invtimen = 'Times'
 
     ncid = -1
+    ncit = -1
     DO inc=1, Nnc
 
       CALL read_dimlength (ncids(inc), TRIM(indtimen), timelen)
@@ -2662,7 +3096,6 @@ MODULE module_netcdf_utils
       istart = (/ 1, 1 /)
       CALL get_var2DC_slice(ncids(inc), 19, timelen, istart, invtimen, wrftime)
 
-      ncit = -1
       DO it=1,timelen
         IF (same_datetime(WRFtime_mat(wrftime(:,it)), obstime, maxTdiff)) THEN
           ncit = it
@@ -2673,6 +3106,130 @@ MODULE module_netcdf_utils
       IF (ncit /= -1) EXIT
     END DO
 
+    IF (ncit == -1) THEN
+      DO inc=1, Nnc
+  
+        CALL read_dimlength (ncids(inc), TRIM(indtimen), timelen)
+
+        IF (ALLOCATED(wrftime)) DEALLOCATE(wrftime)
+        ALLOCATE(wrftime(19,timelen))
+
+        istart = (/ 1, 1 /)
+        CALL get_var2DC_slice(ncids(inc), 19, timelen, istart, invtimen, wrftime)
+  
+        PRINT *,'  ' // TRIM(fname) // ": available times found in file: ", inc, " unit file: ",      &
+          ncids(inc), " _______"
+        dateS = ''
+        DO it=1, timelen
+          DO ic=1, 19
+            dateS(ic:ic) = wrftime(ic,it)
+          END DO
+          PRINT *,'    ', it, ' : ' // TRIM(dateS)
+        END DO
+        WRITE(cyy,'(i4.4)') obstime(1)
+        WRITE(cmm,'(i2.2)') obstime(2)
+        WRITE(cdd,'(i2.2)') obstime(3)
+        WRITE(chh1,'(i2.2)') obstime(4)
+        WRITE(mii,'(i2.2)') obstime(5)
+        WRITE(sii,'(i2.2)') obstime(6)
+        msg = " No equivalence found for date '" // cyy // cmm // cdd // chh1 // mii // sii // "'"
+
+      END DO
+      CALL stoprun(msg, fname)
+    END IF 
+
+    DEALLOCATE(wrftime)
+
+    RETURN
+
+  END SUBROUTINE get_equivmultiWRFtimes
+  
+  SUBROUTINE get_var_equivmultiWRFtimes(dbg, icnf, varn, iproj, obstime, maxTdiff, inc, ncid, ncit,   &
+    foundfilen)
+  ! Subroutine to provide the equivalent WRF time-step for a variable found in a series of netCDF 
+  !   files at a given projection
+
+    IMPLICIT NONE
+
+    TYPE(infconfig), INTENT(in)                          :: icnf
+    INTEGER, INTENT(in)                                  :: iproj, maxTdiff
+    CHARACTER(len=St), INTENT(in)                        :: varn
+    INTEGER, DIMENSION(6), INTENT(in)                    :: obstime
+    LOGICAL, OPTIONAL, INTENT(in)                        :: dbg
+    INTEGER, INTENT(out)                                 :: inc, ncid, ncit
+    CHARACTER(len=Sl), INTENT(out)                       :: foundfilen
+
+    ! Local
+    INTEGER                                              :: ifile, it, ic
+    INTEGER                                              :: rcode, varid
+    INTEGER                                              :: timelen
+    INTEGER, DIMENSION(2)                                :: istart
+    CHARACTER(len=1), DIMENSION(:,:), ALLOCATABLE        :: wrftime
+    CHARACTER(len=4)                                     :: cyy
+    CHARACTER(len=2)                                     :: cmm, cdd, chh, chh1, mii, sii
+    CHARACTER(len=19)                                    :: dateS
+    CHARACTER(len=Su)                                    :: indtimen, invtimen
+    LOGICAL                                              :: db
+    CHARACTER(len=Sm)                                    :: fname
+
+!!!!!!! Variables
+! icnf: structure with all the information about files, variables and their projections
+! indtimen: name of the dimension time ('Time')
+! invtimen: name of the variable time ('Times')
+! obstime: matrix representation of the date to search equivalency
+! maxTdiff: allowed maximum time-difference in seconds to check for same times
+! inc: temporal value in the file
+! ncid: netCDF unit where the time is found
+! ncit: equivalent time-step from netCDF file
+
+    fname = 'get_equivmultiWRFtimes'
+    indtimen = 'Time'
+    invtimen = 'Times'
+
+    db = .FALSE.
+    IF (PRESENT(dbg)) db = dbg
+
+    ! Looping in files with the same projection
+    DO inc=1, icnf%inNpfile(iproj)
+
+      IF (isin_file(icnf%inprojfilen(iproj,inc), varn)) THEN
+      
+        ncid = -1
+        ncit = -1
+
+        CALL read_dimlength (icnf%inprojncid(iproj,inc), TRIM(indtimen), timelen)
+
+        IF (ALLOCATED(wrftime)) DEALLOCATE(wrftime)
+        ALLOCATE(wrftime(19,timelen))
+
+        istart = (/ 1, 1 /)
+        CALL get_var2DC_slice(icnf%inprojncid(iproj,inc), 19, timelen, istart, invtimen, wrftime)
+
+        DO it=1,timelen
+          IF (same_datetime(WRFtime_mat(wrftime(:,it)), obstime, maxTdiff)) THEN
+            ncit = it
+            ncid = icnf%inprojncid(iproj,inc)
+            foundfilen = icnf%inprojfilen(iproj,inc)
+            IF (dbg) THEN
+              WRITE(cyy,'(i4.4)') obstime(1)
+              WRITE(cmm,'(i2.2)') obstime(2)
+              WRITE(cdd,'(i2.2)') obstime(3)
+              WRITE(chh1,'(i2.2)') obstime(4)
+              WRITE(mii,'(i2.2)') obstime(5)
+              WRITE(sii,'(i2.2)') obstime(6)
+              PRINT *, '  ' // TRIM(fname) // ": in projection " // ItoS(iproj) // "' variable '" //  &
+                TRIM(varn) // "' at time step: " // cyy // '/' // cmm // '/' // cdd // " " // chh1 // &
+                ":" // mii // ":" // sii // " found in file '" //TRIM(foundfilen) // "' unit: " //    &
+               ItoS(ncid) // " time-step: " // ItoS(ncit)
+            END IF
+            EXIT
+          END IF
+        END DO
+      END IF
+
+      IF (ncit /= -1) EXIT
+    END DO
+
     IF (ncit == -1) THEN
       WRITE(cyy,'(i4.4)') obstime(1)
       WRITE(cmm,'(i2.2)') obstime(2)
@@ -2680,16 +3237,36 @@ MODULE module_netcdf_utils
       WRITE(chh1,'(i2.2)') obstime(4)
       WRITE(mii,'(i2.2)') obstime(5)
       WRITE(sii,'(i2.2)') obstime(6)
-      msg = " No equivalence found for date '" // cyy // cmm // cdd // chh1 // mii // sii // "'"
+      msg = " No equivalence found for date '" // cyy // cmm // cdd // chh1 // mii // sii // "'"      &
+        // " and variable '" // TRIM(varn) // "' in projection: " // ItoS(iproj) // "!!" 
+      DO inc=1, icnf%inNpncids(iproj)
+        CALL read_dimlength (icnf%inprojncid(iproj,inc), TRIM(indtimen), timelen)
+
+        IF (ALLOCATED(wrftime)) DEALLOCATE(wrftime)
+        ALLOCATE(wrftime(19,timelen))
+
+        istart = (/ 1, 1 /)
+        CALL get_var2DC_slice(icnf%inprojncid(iproj,inc), 19, timelen, istart, invtimen, wrftime)
+  
+        PRINT *,'  ' // TRIM(fname) // ": available times found in file: ", inc, " unit file: ",      &
+          icnf%inprojncid(iproj,inc), " _______"
+        dateS = ''
+        DO it=1, timelen
+          DO ic=1, 19
+            dateS(ic:ic) = wrftime(ic,it)
+          END DO
+          PRINT *,'    ', it, ' : ' // TRIM(dateS)
+        END DO
+      END DO
       CALL stoprun(msg, fname)
     END IF 
 
-    DEALLOCATE(wrftime)
+    IF (ALLOCATED(wrftime)) DEALLOCATE(wrftime)
 
     RETURN
 
-  END SUBROUTINE get_equivmultiWRFtimes
-
+  END SUBROUTINE get_var_equivmultiWRFtimes
+  
 ! SECTION -- section: other
 !! 
 
@@ -2785,18 +3362,18 @@ MODULE module_netcdf_utils
 
     ! Formula is pres = [varn1](k) + [varn2](k)*[varn3](i,j,t)
     ! First variable
-    ncid = search_var(nfiles, ncids, TRIM(varns(1)))
+    ncid = search_var(fname, nfiles, ncids, TRIM(varns(1)))
     CALL get_var1D(ncid, dz, varns(1), var1)
     CALL get_varattr(ncid, varns(1), 'units', 1, var1u)
 
     ! Second variable
-    ncid = search_var(nfiles, ncids, TRIM(varns(2)))
+    ncid = search_var(fname, nfiles, ncids, TRIM(varns(2)))
     CALL get_var1D(ncid, dz, varns(2), var2)
 
     ! Third variable
-    ncid = search_var(nfiles, ncids, TRIM(varns(3)))
+    ncid = search_var(fname, nfiles, ncids, TRIM(varns(3)))
 
-    CALL multisearch_var(.FALSE., nfiles, ncids, TRIM(varns(3)), Nfvar, ffilens, fncids)
+    CALL multisearch_var(.FALSE., fname, nfiles, ncids, TRIM(varns(3)), Nfvar, ffilens, fncids)
 
     IF (TRIM(vtimen) /= 'WRFtime') THEN
       CALL get_equivmultitimes(Nfvar, fncids(1:Nfvar), dtimen, vtimen, oDs, maxTdiff, ifile, ncid,    &
@@ -2964,24 +3541,23 @@ MODULE module_netcdf_utils
                       END IF
 
                       ! Extrapolation of zg_pl
-                      tvu = tu * ( 1. + 0.608 * qu )
-                      IF ( zu .GT. zshul ) THEN
-                        tvd = tvu + zu * 6.5E-3
-                        IF ( tvd .GT. tvshul ) THEN
-                          IF ( tvu .GT. tvshul) THEN
-                            tvd = tvshul - 5.E-3 * ( tvu - tvshul ) ** 2
-                          ELSE
-                            tvd = tvshul
+                      IF (PRESENT(ght_pl)) THEN
+                        tvu = tu * ( 1. + 0.608 * qu )
+                        IF ( zu .GT. zshul ) THEN
+                          tvd = tvu + zu * 6.5E-3
+                          IF ( tvd .GT. tvshul ) THEN
+                            IF ( tvu .GT. tvshul) THEN
+                              tvd = tvshul - 5.E-3 * ( tvu - tvshul ) ** 2
+                            ELSE
+                              tvd = tvshul
+                            ENDIF
                           ENDIF
+                          gammas = ( tvu - tvd ) / zu
+                        ELSE
+                          gammas = 0.
                         ENDIF
-                        gammas = ( tvu - tvd ) / zu
-                      ELSE
-                        gammas = 0.
-                      ENDIF
-                      part = ( r_d / g ) * ( ALOG(pm) - ALOG(pd) )
-                      zg_pl = zu - tvu * part / ( 1. + 0.5 * gammas * part )
-
-                      IF (PRESENT(ght_pl)) THEN
+                        part = ( r_d / g ) * ( ALOG(pm) - ALOG(pd) )
+                        zg_pl = zu - tvu * part / ( 1. + 0.5 * gammas * part )
                         ght_pl(i,j,kp) = zg_pl
                       END IF
  
@@ -3034,11 +3610,11 @@ MODULE module_netcdf_utils
                       END IF
                       
                       !  7. Dewpoint (K) - Use Bolton's approximation
-                      IF (PRESENT(qv_pl)) THEN
+                      IF (PRESENT(qv_pl) .AND. PRESENT(td_pl)) THEN
                         ed = qv_pl(i,j,kp) * pm * 0.01 / ( eps + qv_pl(i,j,kp) )
                         ed = max(ed, 0.001)   ! water vapor pressure in mb.
                         td_pl(i,j,kp) = t_kelvin + (s1 / ((s2 / log(ed/s3)) - 1.0))
-                      ELSE
+                      ELSE IF (PRESENT(tda)) THEN
                         td_pl(i,j,kp) = tda(i,j,ke)
                       END IF
 
@@ -3065,14 +3641,14 @@ MODULE module_netcdf_utils
                      !  Now we just put in a list of diagnostics for this level.
    
                      !  1. geopotential (m2s-2)
-                     IF (PRESENT(z)) THEN
+                     IF (PRESENT(z) .AND. PRESENT(ght_pl)) THEN
                        zu = z(i,j,ke+1)
                        zd = z(i,j,ke)
                        ght_pl(i,j,kp) = ( zu * (pm-pd) + zd * (pu-pm) ) / (pu-pd)
                      END IF
    
                      !  2. Temperature (K)
-                     IF (PRESENT(t)) THEN
+                     IF (PRESENT(t) .AND. PRESENT(t_pl)) THEN
                        tu = t(i,j,ke+1)
                        td = t(i,j,ke)
                        t_pl(i,j,kp) = ( tu * (pm-pd) + td * (pu-pm) ) / (pu-pd)
@@ -3092,7 +3668,7 @@ MODULE module_netcdf_utils
                      END IF
    
                      !  4. Mixing ratio (kg/kg)
-                     IF (PRESENT(qv)) THEN
+                     IF (PRESENT(qv) .AND. PRESENT(qv_pl)) THEN
                        qu = MAX(qv(i,j,ke+1),0.)
                        qd = MAX(qv(i,j,ke),0.)
                        qv_pl(i,j,kp) = ( qu * (pm-pd) + qd * (pu-pm) ) / (pu-pd)
@@ -3668,10 +4244,298 @@ MODULE module_netcdf_utils
 
   END SUBROUTINE compute_rh_spechumd_2D
 
+  SUBROUTINE var_qv_rh(dx, dy, dz, dt, t, press, hur, qv)
+! Subroutine to compute water vapour mixing ratio using August-Roche-Magnus approximation from rh [1]
+
+    IMPLICIT NONE
+
+    INTEGER, INTENT(in)                                  :: dx, dy, dz, dt
+    REAL, DIMENSION(dx,dy,dz,dt), INTENT(in)             :: t, hur
+    REAL, DIMENSION(dz), INTENT(in)                      :: press
+    REAL, DIMENSION(dx,dy,dz,dt), INTENT(out)            :: qv
+
+! Local
+    INTEGER                                              :: i,j,k,l
+    REAL, DIMENSION(dx,dy,dz,dt)                         :: tC, es, ws
+    CHARACTER(len=50)                                    :: fname
+
+!!!!!!! Variables
+! t: temperature [K]
+! press: pressure [Pa]
+! dz: vertical extension
+! hur: relative humidity [1]
+! qv: mixing ratio [kgkg-1]
+
+    fname = 'var_qv'
+
+    ! August - Roche - Magnus formula (Avoiding overflow on last level)
+    tC = t - SVPT0
+    
+    es = ARM1 * exp(ARM2*tC/(tC+ARM3))
+    ! Saturated mixing ratio
+    DO i=1,dx
+      DO j=1,dy
+        DO k=1,dz
+          DO l=1,dt
+!            IF (es(i,j,k,l) == 0.01*press(k)) THEN
+!              ws(i,j,k,l) = mol_watdry*es(i,j,k,l)
+!            ELSE
+              ws(i,j,k,l) = mol_watdry*es(i,j,k,l)/(0.01*press(k)-es(i,j,k,l))
+              ! Removing wrong values
+              IF (ws(i,j,k,l) < 0.) ws(i,j,k,l) = 0.
+
+              ! Water vapour mixing ratio
+              IF (hur(i,j,k,l) > 100.) THEN
+                qv(i,j,k,l) = 100.*ws(i,j,k,l)
+              ELSE
+                qv(i,j,k,l) = hur(i,j,k,l)*ws(i,j,k,l)
+              END IF
+!            END IF
+          END DO
+        END DO
+      END DO
+    END DO
+ 
+    RETURN
+
+  END SUBROUTINE var_qv_rh
 
 ! SECTION -- section: generic
 !! 
 
+  LOGICAL FUNCTION isInlistS(Nlist, listS, srtingS)
+  ! Funtion to check is a given string is in a list of String values
+
+    IMPLICIT NONE
+
+    INTEGER, INTENT(in)                                  :: Nlist
+    CHARACTER(len=*), INTENT(in)                         :: srtingS
+    CHARACTER(len=*), DIMENSION(Nlist), INTENT(in)       :: listS
+
+! Local
+    INTEGER                                              :: i
+    CHARACTER(len=50)                                    :: fname
+
+    fname = 'isInlist'
+
+    isInlistS = .FALSE.
+
+    DO i=1, Nlist
+      IF (TRIM(listS(i)) == TRIM(srtingS)) THEN
+        isInlistS = .TRUE.
+        EXIT
+      END IF
+    END DO
+
+    RETURN
+
+  END FUNCTION isInlistS
+
+  SUBROUTINE same_shape1DR(d1, d2, vec1, vec2, varn1, varn2, iserror, same)
+  ! Subroutine to determine if 2 real vectors have the same length
+  
+    IMPLICIT NONE
+    
+    INTEGER, INTENT(in)                                :: d1, d2
+    REAL, DIMENSION(d1), INTENT(in)                    :: vec1
+    REAL, DIMENSION(d2), INTENT(in)                    :: vec2
+    CHARACTER(len=Sm), INTENT(in)                      :: varn1, varn2
+    LOGICAL, INTENT(in)                                :: iserror    
+    LOGICAL, INTENT(out)                               :: same
+    
+    ! Local
+    INTEGER                                            :: i
+    CHARACTER(len=Ss)                                  :: fname
+    
+!!!!!!! Variables
+! d1: length of vector 1
+! d2: length of vector 2
+! vec1: first vector to compare
+! vec2: second vector to compare
+! varn[1/2]: names of the vector 1 and 2
+! iserror: whether in case vectors have different sizes, and error should be arise
+
+    fname = 'smae_shape1DR'
+    
+    same = .TRUE.
+
+    IF ( d1 /= d2) THEN
+      same = .FALSE.
+      IF (iserror) THEN
+        PRINT *, TRIM(fname) // ": vectors have different sizes !!"
+        PRINT *, "    vector 1: '" // TRIM(varn1) // "' has size ", d1
+        PRINT *, "    vector 2: '" // TRIM(varn2) // "' has size ", d2
+        RETURN
+      END IF
+    END IF
+    
+    RETURN
+  
+  END SUBROUTINE same_shape1DR
+
+  SUBROUTINE same_shape2DR(d1a, d1b, d2a, d2b, arr1, arr2, varn1, varn2, iserror, same)
+  ! Subroutine to determine if 2 real arrays of rank 2 have the same length
+  
+    IMPLICIT NONE
+    
+    INTEGER, INTENT(in)                                :: d1a, d1b, d2a, d2b
+    REAL, DIMENSION(d1a,d1b), INTENT(in)               :: arr1
+    REAL, DIMENSION(d2a,d2b), INTENT(in)               :: arr2
+    CHARACTER(len=Sm), INTENT(in)                      :: varn1, varn2
+    LOGICAL, INTENT(in)                                :: iserror
+    LOGICAL, INTENT(out)                               :: same
+    
+    ! Local
+    INTEGER                                            :: i, d1, d2, Ntotdim
+    INTEGER, DIMENSION(2)                              :: dima1, dima2
+    CHARACTER(len=Ss)                                  :: fname
+    
+!!!!!!! Variables
+! d1a,d1b: extent of array 1
+! d2a,d2b: extent of array 2
+! arr1: first array to compare
+! arr2: second array to compare
+! varn[1/2]: names of the array 1 and 2
+! iserror: whether in case vectors have different sizes, and error should be arise
+
+    fname = 'same_shape2DR'
+    
+    ! Shapes
+    dima1 = UBOUND(arr1)
+    dima2 = UBOUND(arr2)
+    
+    Ntotdim = 2
+    
+    same = .TRUE.
+    DO i=1, Ntotdim
+      d1 = dima1(i)
+      d2 = dima2(i)
+      IF ( d1 /= d2) THEN
+        same = .FALSE.
+        IF (iserror) THEN
+          PRINT *, TRIM(fname) // ": arrays at dimension ", i ," have different sizes !!"
+          PRINT *, "    array 1: '" // TRIM(varn1) // "' has size ", d1
+          PRINT *, "    array 2: '" // TRIM(varn2) // "' has size ", d2
+          PRINT *, "      shape array 1: ", dima1
+          PRINT *, "      shape array 2: ", dima2
+          RETURN
+        END IF
+      END IF
+    END DO
+    
+    RETURN
+  
+  END SUBROUTINE same_shape2DR
+
+  SUBROUTINE same_shape3DR(d1a, d1b, d1c, d2a, d2b, d2c, arr1, arr2, varn1, varn2, iserror, same)
+  ! Subroutine to determine if 2 real arrays of rank 3 have the same length
+  
+    IMPLICIT NONE
+    
+    INTEGER, INTENT(in)                                :: d1a, d1b, d1c, d2a, d2b, d2c
+    REAL, DIMENSION(d1a,d1b,d1c), INTENT(in)           :: arr1
+    REAL, DIMENSION(d2a,d2b,d2c), INTENT(in)           :: arr2
+    CHARACTER(len=Sm), INTENT(in)                      :: varn1, varn2
+    LOGICAL, INTENT(in)                                :: iserror
+    LOGICAL, INTENT(out)                               :: same
+    
+    ! Local
+    INTEGER                                            :: i, d1, d2, Ntotdim
+    INTEGER, DIMENSION(3)                              :: dima1, dima2
+    CHARACTER(len=Ss)                                  :: fname
+    
+!!!!!!! Variables
+! d1a,d1b,d1c: extent of array 1
+! d2a,d2b,d2c: extent of array 2
+! arr1: first array to compare
+! arr2: second array to compare
+! varn[1/2]: names of the array 1 and 2
+! iserror: whether in case vectors have different sizes, and error should be arise
+
+    fname = 'same_shape3DR'
+    
+    ! Shapes
+    dima1 = UBOUND(arr1)
+    dima2 = UBOUND(arr2)
+    
+    Ntotdim = 3
+    
+    same = .TRUE.
+    DO i=1, Ntotdim
+      d1 = dima1(i)
+      d2 = dima2(i)
+      IF ( d1 /= d2) THEN
+        same = .FALSE.
+        IF (iserror) THEN
+          PRINT *, TRIM(fname) // ": arrays at dimension ", i ," have different sizes !!"
+          PRINT *, "    array 1: '" // TRIM(varn1) // "' has size ", d1
+          PRINT *, "    array 2: '" // TRIM(varn2) // "' has size ", d2
+          PRINT *, "      shape array 1: ", dima1
+          PRINT *, "      shape array 2: ", dima2
+          RETURN
+        END IF
+      END IF
+    END DO
+    
+    RETURN
+  
+  END SUBROUTINE same_shape3DR
+
+  SUBROUTINE same_shape4DR(d1a, d1b, d1c, d1d, d2a, d2b, d2c, d2d, arr1, arr2, varn1, varn2, iserror, &
+    same)
+  ! Subroutine to determine if 2 real arrays of rank 4 have the same length
+  
+    IMPLICIT NONE
+    
+    INTEGER, INTENT(in)                                :: d1a, d1b, d1c, d1d, d2a, d2b, d2c, d2d
+    REAL, DIMENSION(d1a,d1b,d1c,d1d), INTENT(in)       :: arr1
+    REAL, DIMENSION(d2a,d2b,d2c,d2d), INTENT(in)       :: arr2
+    CHARACTER(len=Sm), INTENT(in)                      :: varn1, varn2
+    LOGICAL, INTENT(in)                                :: iserror
+    LOGICAL, INTENT(out)                               :: same
+    
+    ! Local
+    INTEGER                                            :: i, d1, d2, Ntotdim
+    INTEGER, DIMENSION(4)                              :: dima1, dima2
+    CHARACTER(len=Ss)                                  :: fname
+    
+!!!!!!! Variables
+! d1a,d1b,d1c,d1d: extent of array 1
+! d2a,d2b,d2c,d2d: extent of array 2
+! arr1: first array to compare
+! arr2: second array to compare
+! varn[1/2]: names of the array 1 and 2
+! iserror: whether in case vectors have different sizes, and error should be arise
+
+    fname = 'same_shape4DR'
+    
+    ! Shapes
+    dima1 = UBOUND(arr1)
+    dima2 = UBOUND(arr2)
+    
+    Ntotdim = 4
+    
+    same = .TRUE.
+    DO i=1, Ntotdim
+      d1 = dima1(i)
+      d2 = dima2(i)
+      IF ( d1 /= d2) THEN
+        same = .FALSE.
+        IF (iserror) THEN
+          PRINT *, TRIM(fname) // ": arrays at dimension ", i ," have different sizes !!"
+          PRINT *, "    array 1: '" // TRIM(varn1) // "' has size ", d1
+          PRINT *, "    array 2: '" // TRIM(varn2) // "' has size ", d2
+          PRINT *, "      shape array 1: ", dima1
+          PRINT *, "      shape array 2: ", dima2
+          RETURN
+        END IF
+      END IF
+    END DO
+    
+    RETURN
+  
+  END SUBROUTINE same_shape4DR
+
   LOGICAL FUNCTION IsMiss(val, missv)
   ! Funciton to determine if a given value is missing vaue or near by
 
@@ -4322,6 +5186,20 @@ MODULE module_netcdf_utils
 
   END FUNCTION same_datetime
 
+  SUBROUTINE stoprunfunc(msg, funcname, fname)
+! Subroutine to stop running and print a message when function is called from another one
+
+    IMPLICIT NONE
+
+    CHARACTER(LEN=*), INTENT(IN)                         :: funcname, fname
+    CHARACTER(LEN=*), INTENT(IN)                         :: msg
+
+    PRINT *, TRIM(errormsg)
+    PRINT *, '  From ' // TRIM(funcname) // ' when using ' // TRIM(fname) // ': ' // TRIM(msg)
+    STOP -1
+
+  END SUBROUTINE stoprunfunc
+
   SUBROUTINE stoprun(msg, fname)
 ! Subroutine to stop running and print a message
 
@@ -4450,7 +5328,7 @@ MODULE module_netcdf_utils
     ! Local
     INTEGER                                              :: ic, Lunits
     CHARACTER(len=Ss)                                    :: str, units
-    CHARACTER(len=Ss), DIMENSION(33)                     :: fixedunits
+    CHARACTER(len=Ss), DIMENSION(34)                     :: fixedunits
     CHARACTER(len=Ss)                                    :: fname
 
 !!!!!!! Variables
@@ -4502,12 +5380,15 @@ MODULE module_netcdf_utils
     fixedunits(31) = 'y' // TRIM(Nstrings(' ', 49))
     fixedunits(32) = 'year' // TRIM(Nstrings(' ', 46))
     fixedunits(33) = '-' // TRIM(Nstrings(' ', 49))
+    fixedunits(34) = '%' // TRIM(Nstrings(' ', 49))
 
     homunits: IF (Index1DArrayS(fixedunits, 33, TRIM(units)) /= -1) THEN
       genunits = TRIM(units)
     ELSE
       IF (TRIM(units) == '') THEN
         genunits = '-'
+      ELSE IF (TRIM(units) == '%') THEN
+        genunits = '%'
       ELSE IF (TRIM(units) == '1') THEN
         genunits = '1'
       ELSE IF (TRIM(units) == 'C') THEN
@@ -4826,7 +5707,7 @@ MODULE module_netcdf_utils
     ! Local
     INTEGER                                              :: i
     INTEGER                                              :: Navail, Navail1
-    CHARACTER(len=Ss), DIMENSION(13)                     :: availunits
+    CHARACTER(len=Ss), DIMENSION(14)                     :: availunits
     CHARACTER(len=Ss), DIMENSION(:), ALLOCATABLE         :: availunits1
     CHARACTER(len=Ss)                                    :: fname
 !!!!!!! Variables
@@ -4851,7 +5732,9 @@ MODULE module_netcdf_utils
     availunits(11) = 'Pa' // TRIM(Nstrings(' ', 47))
     availunits(12) = 'rad' // TRIM(Nstrings(' ', 47))
     availunits(13) = '-' // TRIM(Nstrings(' ', 49))
-    Navail = 13
+    availunits(14) = '%' // TRIM(Nstrings(' ', 49))
+    
+    Navail = 14
 
     ! Comes out, that TRIM does not caputre ICHAR=0, some files might have this character in the units
 
@@ -4889,9 +5772,25 @@ MODULE module_netcdf_utils
         PRINT *,'    available ones: ', (TRIM(availunits1(i)), i=1, Navail1)
         STOP
       END IF
+      
+    ELSE IF (eqstr(units1,'%')) THEN
+      Navail1 = 1
+      IF (ALLOCATED(availunits1)) DEALLOCATE(availunits1)
+      ALLOCATE (availunits1(Navail1))
+      availunits1(1) = '1' // TRIM(Nstrings(' ', 49))
+      IF (eqstr(units2,'1')) THEN
+        oper = 'mulc'
+        factor = 100.
+      ELSE
+        PRINT *,TRIM(errormsg)
+        msg = "for ref. units '" // TRIM(units1) // "' not available '" // TRIM(units2) // "' !!"
+        PRINT *,'  ' // TRIM(fname) // ": " // TRIM(msg)
+        PRINT *,'    available ones: ', (TRIM(availunits1(i)), i=1, Navail1)
+        STOP
+      END IF
 
     ELSE IF (eqstr(units1,'1')) THEN
-      Navail1 = 1
+      Navail1 = 2
       IF (ALLOCATED(availunits1)) DEALLOCATE(availunits1)
       ALLOCATE (availunits1(Navail1))
       availunits1(1) = '-' // TRIM(Nstrings(' ', 49))
@@ -5119,6 +6018,8 @@ MODULE module_netcdf_utils
 
     END IF changingunits
 
+    IF (ALLOCATED(availunits1)) DEALLOCATE(availunits1)
+
     RETURN
 
   END SUBROUTINE equal_units_operfactor
@@ -5141,8 +6042,6 @@ MODULE module_netcdf_utils
     INTEGER                                              :: i
     INTEGER                                              :: Navail, Navail1
     CHARACTER(len=St)                                    :: genunits2
-    CHARACTER(len=Ss), DIMENSION(10)                     :: availunits
-    CHARACTER(len=Ss), DIMENSION(:), ALLOCATABLE         :: availunits1
     CHARACTER(len=Ss)                                    :: fname
 
 !!!!!!! Variables
@@ -5200,8 +6099,6 @@ MODULE module_netcdf_utils
     INTEGER                                              :: i, j
     INTEGER                                              :: Navail, Navail1
     CHARACTER(len=St)                                    :: genunits2
-    CHARACTER(len=Ss), DIMENSION(10)                     :: availunits
-    CHARACTER(len=Ss), DIMENSION(:), ALLOCATABLE         :: availunits1
     CHARACTER(len=Ss)                                    :: fname
 
 !!!!!!! Variables
@@ -5265,8 +6162,6 @@ MODULE module_netcdf_utils
     INTEGER                                              :: i, j, k
     INTEGER                                              :: Navail, Navail1
     CHARACTER(len=St)                                    :: genunits2
-    CHARACTER(len=Ss), DIMENSION(10)                     :: availunits
-    CHARACTER(len=Ss), DIMENSION(:), ALLOCATABLE         :: availunits1
     CHARACTER(len=Ss)                                    :: fname
 
 !!!!!!! Variables
@@ -5336,8 +6231,6 @@ MODULE module_netcdf_utils
     INTEGER                                              :: i, j, k, l
     INTEGER                                              :: Navail, Navail1
     CHARACTER(len=St)                                    :: genunits2
-    CHARACTER(len=Ss), DIMENSION(10)                     :: availunits
-    CHARACTER(len=Ss), DIMENSION(:), ALLOCATABLE         :: availunits1
     CHARACTER(len=Ss)                                    :: fname
 
 !!!!!!! Variables
@@ -5356,13 +6249,39 @@ MODULE module_netcdf_utils
     CALL equal_units_operfactor(units1, genunits2, ext, oper, factor)
 
     newvals2 = fillvalue
-
+    
+! See erro message below
+!    PRINT *,' Lluis units2 ', TRIM(units2), ' genunits2 ', TRIM(genunits2), ' units1 ', TRIM(units1)
+!    PRINT *,' Lluis oper ', TRIM(oper), ' factor ', factor, ' fillvalue ', fillvalue
+  
     ! Changing values
     IF (TRIM(oper) == 'addc') THEN
       DO i=1, d1
         DO j=1, d2
           DO k=1, d3
             DO l=1, d4
+! L. Fita
+! When compiling in debug mode this gave an error message this is why the print, but
+!   no clue was found, QVAPOR variable
+! (...)
+!           2           2          30           1 :   4.99659063E-06 |  -1.00000002E+30  <>  T
+!Program received signal SIGFPE: Floating-point exception - erroneous arithmetic operation.
+!
+!Backtrace for this error:
+!#0  0x7fd25e15abd0 in ???
+!#1  0x7fd25e159e25 in ???
+!#2  0x7fd25de5bdcf in ???
+!	at ./signal/../sysdeps/unix/sysv/linux/x86_64/sigaction.c:0
+!#3  0x5635de6a48f4 in __module_netcdf_utils_MOD_equal_units4dr
+!	at /home/lluis/estudios/RegIPSL/tools/nc2wps/module_netcdf_utils.f90:5894
+!#4  0x5635de6d65c4 in __module_ncwps_MOD_get_3dfield
+!	at /home/lluis/estudios/RegIPSL/tools/nc2wps/module_ncwps.f90:3652
+!#5  0x5635de73e314 in netcdf2wps
+!	at /home/lluis/estudios/RegIPSL/tools/nc2wps/netcdf2wps.f90:2395
+!#6  0x5635de7637f5 in main
+!	at /home/lluis/estudios/RegIPSL/tools/nc2wps/netcdf2wps.f90:69
+!              IF (TRIM(units2) == 'kg kg-1') PRINT *,i,j,k,l, ':', vals2(i,j,k,l), '|',               &
+!              newvals2(i,j,k,l), ' <> ', vals2(i,j,k,l) /= fillvalue
               IF (vals2(i,j,k,l) /= fillvalue) newvals2(i,j,k,l) = vals2(i,j,k,l) + factor
             END DO
           END DO
@@ -5502,7 +6421,7 @@ MODULE module_netcdf_utils
 ! dx: distance of the x-axis differentials
 
     fname = 'linear_interp_densbars'
-
+    
     linear_interp_densbars = 0.
 
     minxdiff = 0.
@@ -5546,6 +6465,15 @@ MODULE module_netcdf_utils
       END DO
 
     END IF
+    
+    IF (iminxdiff(1) == -1) THEN
+      PRINT *, '  ' // TRIM(fname) // ' _______'
+      PRINT *, '    layers:', (i, ':', xvals(1,i), ',', xvals(2,i), i=1,d1)
+      PRINT *, '    y values:', yvals
+      PRINT *, '      layer to interpolate:', xsearch
+      msg = 'I can not interpolate at passed the location'
+      CALL stoprun(msg, fname)
+    END IF
 
     newbaramount = 0.
     IF (iminxdiff(2) - iminxdiff(1) > 0) THEN
diff --git a/nc2wps/namelist.nc2wps_rawWRF-example b/nc2wps/namelist.nc2wps_rawWRF-example
new file mode 100644
index 0000000000000000000000000000000000000000..859c84dea7c00181bc943ca586bb74a05abf3138
--- /dev/null
+++ b/nc2wps/namelist.nc2wps_rawWRF-example
@@ -0,0 +1,79 @@
+&indata
+ nfiles = 1
+ infilens = '/home/lluis/PY/wrfout_d01_2015-11-10_00:00:00',
+ Nintpres = 23
+ intpres = 100000,97500,95000,92500,90000,87500,85000,82500,80000,75000,70000,65000,60000,55000,50000,45000,40000,35000,30000,25000,20000,15000,10000,
+ invmaskn = 'LANDMASK'
+ invorogn = 'HGT'
+ invhursn = 'None'
+ invhussn = 'None'
+ invqvsn = 'Q2'
+ invtdsn = 'None'
+ invuasn = 'U10'
+ invvasn = 'V10'
+ invtasn = 'T2'
+ invtsn = 'TSK'
+ invsstn = 'SST'
+ invpsn = 'PSFC'
+ invpsln = 'None'
+ invstl1n = 'WRFstl'
+ invstl2n = 'WRFstl'
+ invstl3n = 'WRFstl'
+ invstl4n = 'WRFstl'
+ invswvl1n = 'WRFswvl'
+ invswvl2n = 'WRFswvl'
+ invswvl3n = 'WRFswvl'
+ invswvl4n = 'WRFswvl'
+ invuan = 'U'
+ inptua = 'modlev'
+ invvan = 'V'
+ inptva = 'modlev'
+ invtan = 'WRFta'
+ inptta = 'modlev'
+ invtdan = 'None'
+ invhurn = 'None'
+ invqvn = 'QVAPOR'
+ inptqv = 'modlev'
+ invhusn = 'None'
+ invzgn = 'WRFgeop'
+ inptzg = 'modlev'
+ p_top = 10000
+ itpt = 12
+ jtpt = 12 
+ ktpt = 5
+ ltpt = 1
+ debug = .T.
+/
+
+&projection
+ nprojs = 1
+ version = 5
+ xfcst = 0.
+ map_source = 'WRF simulation' 
+ iproj = 3
+ is_wind_grid_rel = .false.
+ startloc = 'SWCORNER' 
+ lonres = 100000.
+ latres = 100000.
+ centlon = -68.
+ truelat1 = -32.5
+ truelat2 = -44.5
+ earth_radius = 6370000. 
+ indtimen = 'Time'
+ indlatn = 'south_north'
+ indlonn = 'west_east'
+ indplevn = 'None'
+ indmodlevn = 'bottom_top'
+ invtimen = 'WRFtime'
+ invlatn = 'XLAT'
+ invlonn = 'XLONG'
+ invplevn = 'None'
+ invmodlevn = 'WRFpress'
+/
+
+&ungrib
+ Houtfilen = 'FILEtest'
+ iodate = '2015-11-10_00:00:00'
+ eodate = '2015-11-10_12:00:00'
+ ofreq = 10800
+/
diff --git a/nc2wps/namelist_nc2wps_CMIP6 b/nc2wps/namelist_nc2wps_CMIP6
new file mode 100644
index 0000000000000000000000000000000000000000..56ca54c9ba1ce5f9003cd49775f3d8001c935855
--- /dev/null
+++ b/nc2wps/namelist_nc2wps_CMIP6
@@ -0,0 +1,79 @@
+&indata
+ nfiles = 13,
+ infilens = '/bdd/CMIP6/ScenarioMIP/DKRZ/MPI-ESM1-2-HR/ssp370/r1i1p1f1/6hrPlevPt/ta/gn/latest/ta_6hrPlevPt_MPI-ESM1-2-HR_ssp370_r1i1p1f1_gn_-99999000600-endchk1yrendchk1mnendchk1da0000.nc','/bdd/CMIP6/ScenarioMIP/DKRZ/MPI-ESM1-2-HR/ssp370/r1i1p1f1/6hrLev/ua/gn/latest/ua_6hrLev_MPI-ESM1-2-HR_ssp370_r1i1p1f1_gn_-99999000600-endchk1Byrendchk1Bmnendchk1Bda0000.nc','/bdd/CMIP6/ScenarioMIP/DKRZ/MPI-ESM1-2-HR/ssp370/r1i1p1f1/6hrLev/va/gn/latest/va_6hrLev_MPI-ESM1-2-HR_ssp370_r1i1p1f1_gn_-99999000600-endchk1Byrendchk1Bmnendchk1Bda0000.nc','/bdd/CMIP6/ScenarioMIP/DKRZ/MPI-ESM1-2-HR/ssp370/r1i1p1f1/6hrPlevPt/hus/gn/latest/hus_6hrPlevPt_MPI-ESM1-2-HR_ssp370_r1i1p1f1_gn_-99999000600-endchk1yrendchk1mnendchk1da0000.nc','/bdd/CMIP6/ScenarioMIP/DKRZ/MPI-ESM1-2-HR/ssp370/r1i1p1f1/6hrPlevPt/zg/gn/latest/zg_6hrPlevPt_MPI-ESM1-2-HR_ssp370_r1i1p1f1_gn_-99999000600-endchk1yrendchk1mnendchk1da0000.nc','/bdd/CMIP6/ScenarioMIP/DKRZ/MPI-ESM1-2-HR/ssp370/r1i1p1f1/6hrPlevPt/psl/gn/latest/psl_6hrPlevPt_MPI-ESM1-2-HR_ssp370_r1i1p1f1_gn_-99999000600-endchk1yrendchk1mnendchk1da0000.nc','/bdd/CMIP6/ScenarioMIP/DKRZ/MPI-ESM1-2-HR/ssp370/r1i1p1f1/6hrPlevPt/uas/gn/latest/uas_6hrPlevPt_MPI-ESM1-2-HR_ssp370_r1i1p1f1_gn_-99999000600-endchk1yrendchk1mnendchk1da0000.nc','/bdd/CMIP6/ScenarioMIP/DKRZ/MPI-ESM1-2-HR/ssp370/r1i1p1f1/6hrPlevPt/vas/gn/latest/vas_6hrPlevPt_MPI-ESM1-2-HR_ssp370_r1i1p1f1_gn_-99999000600-endchk1yrendchk1mnendchk1da0000.nc','/bdd/CMIP6/ScenarioMIP/DKRZ/MPI-ESM1-2-HR/ssp370/r1i1p1f1/6hrPlevPt/tas/gn/latest/tas_6hrPlevPt_MPI-ESM1-2-HR_ssp370_r1i1p1f1_gn_-99999000600-endchk1yrendchk1mnendchk1da0000.nc','/bdd/CMIP6/ScenarioMIP/DKRZ/MPI-ESM1-2-HR/ssp370/r1i1p1f1/6hrPlevPt/tsl/gn/latest/tsl_6hrPlevPt_MPI-ESM1-2-HR_ssp370_r1i1p1f1_gn_-99999000600-endchk1yrendchk1mnendchk1da0000.nc','/bdd/CMIP6/ScenarioMIP/DKRZ/MPI-ESM1-2-HR/ssp370/r1i1p1f1/6hrPlevPt/huss/gn/latest/huss_6hrPlevPt_MPI-ESM1-2-HR_ssp370_r1i1p1f1_gn_-99999000600-endchk1yrendchk1mnendchk1da0000.nc','/bdd/CMIP6/ScenarioMIP/DKRZ/MPI-ESM1-2-HR/ssp370/r1i1p1f1/6hrPlevPt/mrsos/gn/latest/mrsos_6hrPlevPt_MPI-ESM1-2-HR_ssp370_r1i1p1f1_gn_-99999000600-endchk1yrendchk1mnendchk1da0000.nc','/bdd/CMIP6/ScenarioMIP/DKRZ/MPI-ESM1-2-HR/ssp370/r1i1p1f1/6hrPlevPt/ts/gn/latest/ts_6hrPlevPt_MPI-ESM1-2-HR_ssp370_r1i1p1f1_gn_-99999000600-endchk1yrendchk1mnendchk1da0000.nc',
+ inNskiplev = 0
+ invmaskn = 'varVland'
+ varVland = 'mrsos,1,-9999.,neq'
+ invhursn = 'None'
+ invhussn = 'huss'
+ invqvsn = 'None'
+ invtdsn = 'None'
+ invuasn = 'uas'
+ invvasn = 'vas'
+ invtasn = 'tas'
+ invtsn = 'ts'
+ invsstn = 'ts'
+ invpsn = 'None'
+ invpsln = 'psl'
+ invstl1n = 'tskextrap'
+ tskextrap = 'extrap,ts,1,linear;0.95'
+ invstl2n = 'None'
+ invstl3n = 'None'
+ invstl4n = 'None'
+ invswvl1n = 'mrsosextrap'
+ mrsosextrap = 'extrap,mrsos,1,linear;1.1'
+ invswvl2n = 'None'
+ invswvl3n = 'None'
+ invswvl4n = 'None'
+ invuan = 'ua'
+ inptua = 'modlev'
+ invvan = 'va'
+ inptva = 'modlev'
+ invtan = 'ta'
+ inptta = 'plev'
+ invtdan = 'None'
+ invhurn = 'None'
+ invqvn = 'None'
+ invhusn = 'hus'
+ inpthus = 'plev'
+ invzgn = 'zg'
+ p_top = 800
+ inptzg = 'plev'
+ maxtimediff = 21600,
+ itpt = 23
+ jtpt = 17
+ ktpt = 5
+ ltpt = 1
+/
+
+&projection
+ nprojs = 1
+ version = 5
+ xfcst = 0.
+ map_source = 'ECMWF'
+ iproj = 0
+ is_wind_grid_rel = .false.
+ startloc = 'SWCORNER'
+ lonres = 0.9375
+ latres = 0.9346333772438982
+ centlon = 0.
+ earth_radius = 6370000.
+ indtimen = 'time'
+ indlatn = 'lat'
+ indlonn = 'lon'
+ indplevn = 'plev'
+ indmodlevn = 'lev'
+ invtimen = 'time'
+ invlatn = 'lat'
+ invlonn = 'lon'
+ invplevn = 'plev'
+ invmodlevn = 'hybrid:ap,b,ps'
+/
+
+&ungrib
+ Houtfilen = 'FILE'
+ iodate = '2072-01-01_00:00:00'
+ eodate = '2071-12-31_23:59:59'
+ofreq = 21600
+/
+
diff --git a/nc2wps/netcdf2wps.f90 b/nc2wps/netcdf2wps.f90
index 06b5ff3189ca22bbca10e2d62f6231c03dc80511..476a0b021fca4d104d8a5bfbc767dc1d6c4cabd6 100644
--- a/nc2wps/netcdf2wps.f90
+++ b/nc2wps/netcdf2wps.f90
@@ -33,6 +33,17 @@ PROGRAM netcdf2wps
 !      computed following geostrophic balance. Humidity values are taken from the highest level of 
 !      the input data. 
 !    NOTE: This only works if all 3D-fields are at the same projection
+!  14.- Adding more WRF-derived variables to be able to directly process raw WRF output to create new 
+!   forcing (with 3D variables at model levels)
+!    'WRFpres': to use P+PB as input variable for 3D pressure
+!    'WRFgeop': to use PH+PHB as input variable for 3D geopotential
+!    'WRFta': to use potT_to_temp(T+300) as input variable for 3D temperature
+!  15.- Adding computation of slp (mean sea-level pressure) if psfc and orog are provided
+!    NOTE: real.exe is only available to interpolate psfc (see in dyn_em/module_initialieze_real.F, 
+!      SUBROUTINE init_domain_rk) if the following input data is provided:
+!       - ps, orog, psl
+!       - ps, orog
+!       - psl
 ! In case of hurs or q2 and hur or q are 'None' tds, td becomes is mandatory. In that case hur/s is  
 !   retrieved following Magnus formula with D. Bolton, 1980, Mon. Wea. Rev. values
 ! In case 'huss' and 'hus' are provided, qvs, and qv are computed from them accordingly to:
@@ -64,7 +75,7 @@ PROGRAM netcdf2wps
 
        IMPLICIT NONE
 
-       INTEGER                                           :: ncid, ierr
+       INTEGER                                           :: ncid, ncidfound, ncid0, ierr
        INTEGER                                           :: timelen, lonlen, latlen, levellen,        &
          depthlen, modlevellen
        INTEGER                                           :: k, i, j, t
@@ -72,14 +83,14 @@ PROGRAM netcdf2wps
        INTEGER, DIMENSION(2)                             :: start2d
        INTEGER, DIMENSION(3)                             :: count3d
        INTEGER, DIMENSION(4)                             :: count4d
-       REAL, DIMENSION(:,:,:), ALLOCATABLE               :: hurs, huss, qvs, uas, vas, tas, tds
+       REAL, DIMENSION(:,:,:), ALLOCATABLE               :: orog, hurs, huss, qvs, uas, vas, tas, tds
        REAL, DIMENSION(:,:,:), ALLOCATABLE               :: ts, sst, ps, psl, snd, sn, snh, ci
        REAL, DIMENSION(:,:,:), ALLOCATABLE               :: stl1, stl2, stl3, stl4, swvl1, swvl2,     &
          swvl3, swvl4
        REAL, DIMENSION(:,:,:,:), ALLOCATABLE             :: ua_pl, va_pl, ta_pl, tda_pl, hur_pl,      &
         hus_pl, qv_pl, zg_pl
        REAL, DIMENSION(:,:,:,:), ALLOCATABLE             :: ua_ml, va_ml, ta_ml, tda_ml, hur_ml,      &
-        hus_ml, qv_ml, zg_ml, p_ml, modpres
+        hus_ml, qv_ml, zg_ml, p_ml, pb_ml, modpres, geop3D
        REAL, DIMENSION(:,:), ALLOCATABLE                 :: sst_mask
        REAL, DIMENSION(:), ALLOCATABLE                   :: time
        REAL, DIMENSION(:), ALLOCATABLE                   :: level, level2, lon, lat, lat2, modlevel,  &
@@ -99,7 +110,8 @@ PROGRAM netcdf2wps
        character (len=46)                                :: desc
 
 ! L. Fita
-       INTEGER                                           :: ip, iv, iit, nfs
+       INTEGER                                           :: ip, iv, iit, nfs, ncit
+       INTEGER                                           :: Ival
        INTEGER                                           :: idnamelist, idout, ioerr
        INTEGER                                           :: nfiles, itpt, jtpt, ktpt, ltpt,           &
          maxtimediff, inNskiplev, Nintpres, nprojs
@@ -136,21 +148,21 @@ PROGRAM netcdf2wps
          indmodlevn
        CHARACTER(len=St), DIMENSION(maxNprojs)           :: invtimen, invlatn, invlonn, invplevn,     &
          invmodlevn, invpresn
-       CHARACTER(len=St)                                 :: invmaskn, invhursn, invhussn, invqvsn,    &
-         invuasn, invvasn, invtasn, invtdsn, invtsn, invsstn, invpsn, invpsln, invsndn, invcin
+       CHARACTER(len=St)                                 :: invmaskn, invorogn, invhursn, invhussn,   &
+         invqvsn, invuasn, invvasn, invtasn, invtdsn, invtsn, invsstn, invpsn, invpsln, invsndn, invcin
        CHARACTER(len=St)                                 :: invuan, invvan, invtan, invtdan, invhurn, &
          invhusn, invqvn, invzgn
        CHARACTER(len=St)                                 :: invstl1n, invstl2n, invstl3n, invstl4n,   &
          invswvl1n, invswvl2n, invswvl3n, invswvl4n
-       INTEGER                                           :: inprojvmask, inprojvhurs, inprojvhuss,    &
-         inprojvqvs, inprojvuas, inprojvvas, inprojvtas, inprojvtds, inprojvts, inprojvsst,           &
-         inprojvps, inprojvpsl, inprojvsnd, inprojvci
+       INTEGER                                           :: inprojvmask, inprojvorog, inprojvhurs,    &
+         inprojvhuss, inprojvqvs, inprojvuas, inprojvvas, inprojvtas, inprojvtds, inprojvts,          &
+         inprojvsst, inprojvps, inprojvpsl, inprojvsnd, inprojvci
        INTEGER                                           :: inprojvua, inprojvva, inprojvta,          &
          inprojvtda, inprojvhur, inprojvhus, inprojvqv, inprojvzg, inprojvpres
        INTEGER                                           :: inprojvstl1, inprojvstl2, inprojvstl3,    &
          inprojvstl4, inprojvswvl1, inprojvswvl2, inprojvswvl3, inprojvswvl4
        CHARACTER(len=Sl), DIMENSION(:), ALLOCATABLE      :: pfiles
-       CHARACTER(len=Sl)                                 :: indnB, invnA
+       CHARACTER(len=Sl)                                 :: indnB, invnA, foundfilen
        CHARACTER(len=St)                                 :: attrn
        CHARACTER(len=St)                                 :: varu, varinu
        CHARACTER(len=15)                                 :: op
@@ -198,15 +210,16 @@ PROGRAM netcdf2wps
        LOGICAL                                           :: debug, file_exist
 
        NAMELIST /indata/ nfiles, infilens, inNskiplev, inskiplev, Nintpres, intpres, invmaskn,        &
-         inprojvmask, varVland, invhursn, inprojvhurs, invhussn, inprojvhuss, invqvsn, inprojvqvs,    &
-         invuasn, inprojvuas, invvasn, inprojvvas, invtasn, inprojvtas, invtdsn, inprojvtds, invtsn,  &
-         inprojvts, invsstn, inprojvsst, invpsn, inprojvps, invpsln, inprojvpsl, invsndn, inprojvsnd, &
-         invcin, inprojvci, invuan, inptua, inprojvua, invvan, inptva, inprojvva, invtan, inptta,     &
-         inprojvta, invtdan, inpttda, inprojvtda, invhurn, inpthur, inprojvhur, invhusn, inpthus,     &
-         inprojvhus, invqvn, inptqv, inprojvqv, invzgn, inptzg, inprojvzg, invpresn, inprojvpres,     &
-         invstl1n, inprojvstl1, tskextrap, invstl2n, inprojvstl2, invstl3n, inprojvstl3, invstl4n,    &
-         inprojvstl4, invswvl1n, inprojvswvl1, mrsosextrap, invswvl2n, inprojvswvl2, invswvl3n,       &
-         inprojvswvl3, invswvl4n, inprojvswvl4, p_top, maxtimediff, itpt, jtpt, ktpt, ltpt, debug
+         inprojvmask, varVland, invorogn, inprojvorog,invhursn, inprojvhurs, invhussn, inprojvhuss,   &
+         invqvsn, inprojvqvs, invuasn, inprojvuas, invvasn, inprojvvas, invtasn, inprojvtas, invtdsn, &
+         inprojvtds, invtsn, inprojvts, invsstn, inprojvsst, invpsn, inprojvps, invpsln, inprojvpsl,  &
+         invsndn, inprojvsnd, invcin, inprojvci, invuan, inptua, inprojvua, invvan, inptva, inprojvva,&
+         invtan, inptta, inprojvta, invtdan, inpttda, inprojvtda, invhurn, inpthur, inprojvhur,       &
+         invhusn, inpthus, inprojvhus, invqvn, inptqv, inprojvqv, invzgn, inptzg, inprojvzg, invpresn,&
+         inprojvpres, invstl1n, inprojvstl1, tskextrap, invstl2n, inprojvstl2, invstl3n, inprojvstl3, &
+         invstl4n, inprojvstl4, invswvl1n, inprojvswvl1, mrsosextrap, invswvl2n, inprojvswvl2,        &
+         invswvl3n, inprojvswvl3, invswvl4n, inprojvswvl4, p_top, maxtimediff, itpt, jtpt, ktpt,      &
+         ltpt, debug
 
        NAMELIST /projection/ nprojs, version, xfcst, map_source, iproj, is_wind_grid_rel, startloc,   &
          NLg, lonres, latres, centlon, truelat1, truelat2, earth_radius, indtimen, indlatn, indlonn,  &
@@ -234,6 +247,8 @@ PROGRAM netcdf2wps
 !      ne: all values equal to the value will be considered land ([varname] != [value]; land)
 !      lt: all values below to the value will be considered land ([varname] < [value]; land)
 !      gt: all values greater to the value will be considered land ([varname] > [value]; land)
+! invorogn: name of the variable orography height within any flle in [infilens]
+! inprojvorog: number of projection of orog (accordingly to nprojs, 1 default)
 ! invhursn: name of the variable 2-m relative humidity within any flle in [infilens]
 ! inprojvhurs: number of projection of hurs (accordingly to nprojs, 1 default)
 ! invhussn: name of the variable 2-m specific water vapor content within any flle in [infilens]
@@ -267,7 +282,8 @@ PROGRAM netcdf2wps
 ! invvan: name of the variable air northward wind within any flle in [infilens]
 ! inptva: type of vertical level ('plev' or 'modlev') of the northward wind ('plev', default)
 ! inprojvva: number of projection of va (accordingly to nprojs, 1 default)
-! invtan: name of the variable air temperature within any flle in [infilens]
+! invtan: name of the variable air temperature within any flle in [infilens] ('WRFta' for temperature 
+!   from WRF raw output, where temperature is computed from WRF's 'T' variable)
 ! inptta: type of vertical level ('plev' or 'modlev') of the temperature ('plev', default)
 ! inprojvta: number of projection of ta (accordingly to nprojs, 1 default)
 ! invtdan: name of the variable air dew-point temperature within any flle in [infilens]
@@ -282,10 +298,12 @@ PROGRAM netcdf2wps
 ! invqvn: name of the variable air water vapor mixing ratio within any flle in [infilens]
 ! inptqv: type of vertical level ('plev' or 'modlev') of the mixing ratio ('plev', default)
 ! inprojvqv: number of projection of qv (accordingly to nprojs, 1 default)
-! invzgn: name of the variable air geopotential height within any flle in [infilens]
+! invzgn: name of the variable air geopotential height within any flle in [infilens] ('WRFgeop', to
+!   be computed as PH+PHB from WRF output)
 ! inptzg: type of vertical level ('plev' or 'modlev') of the geopotential ('plev', default)
 ! inprojvzg: number of projection of zg (accordingly to nprojs, 1 default)
-! invpresn: name of the variable pressure (at model-level) within any file in [infilens]
+! invpresn: name of the variable pressure (at model-level) within any file in [infilens] ('WRFpres', to
+!   be computed as P+PB from WRF output)
 ! inprojvpres: number of projection of pres (accordingly to nprojs, 1 default)
 ! invstl1n: name of the variable 1st layer (0-7 cm) ground temperature within any flle in [infilens]
 !   if invstl1n = 'WRFstl', soil temperatures will be computed using WRF's 'TSLB' variable
@@ -392,6 +410,7 @@ PROGRAM netcdf2wps
 !   'hybrid:[modpvn1],[modpvn2],[modpvn3]' names of the variables used to compute pressure given by 
 !        its hybdrid formula as: 
 !      pres = [modpvn1]+[modpvn2]*[modpvn3]
+!   'WRFpres' pressure computed from WRF's output as P+PB
 ! ------- Output information -------
 ! Houtfilen: header of the name of the output files. Name of files as [Houtfilen]_[YYYY]-[MM]-[DD]_[HH] 
 !  (in mulitple projections different files per projection will be generated as `Houtfilen[nproj]`)
@@ -411,17 +430,17 @@ PROGRAM netcdf2wps
        infilens = '--'
 
        ! Providing default values for non-mandatory variables
-       CALL Init_values(inNskiplev, invmaskn, varVland, invhursn, invhussn, invqvsn, invuasn,         &
-         invvasn, invtasn, invtdsn, invtsn, invsstn, invpsn, invpsln, invsndn, invcin, invtdan,       &
-         invstl1n, tskextrap, invstl2n, invstl3n, invstl4n, invswvl1n, mrsosextrap, invswvl2n,        &
-         invswvl3n, invswvl4n, inptua, inptva, inptta, inpttda, inpthur, inpthus, inptqv, inptzg,     &
-         p_top, maxtimediff, itpt, jtpt, ktpt, ltpt, debug, infconf)
+       CALL Init_values(inNskiplev, invmaskn, varVland, invorogn, invhursn, invhussn, invqvsn,        &
+         invuasn, invvasn, invtasn, invtdsn, invtsn, invsstn, invpsn, invpsln, invsndn, invcin,       &
+         invtdan, invstl1n, tskextrap, invstl2n, invstl3n, invstl4n, invswvl1n, mrsosextrap,          &
+         invswvl2n, invswvl3n, invswvl4n, inptua, inptva, inptta, inpttda, inpthur, inpthus, inptqv,  &
+         inptzg, p_top, maxtimediff, itpt, jtpt, ktpt, ltpt, debug, infconf)
 
        CALL Init_proj(version, xfcst, map_source, iproj, is_wind_grid_rel, startloc, NLg,             &
-        lonres, latres, centlon, truelat1, truelat2, earth_radius, inprojvmask, inprojvhurs,          &
-        inprojvhuss, inprojvqvs, inprojvuas, inprojvvas, inprojvtas, inprojvtds, inprojvts,           &
-        inprojvsst, inprojvps, inprojvpsl, inprojvsnd, inprojvci, inprojvua, inprojvva, inprojvta,    &
-        inprojvtda, inprojvhur, inprojvhus, inprojvqv, inprojvzg, inprojvstl1, inprojvstl2,           &
+        lonres, latres, centlon, truelat1, truelat2, earth_radius, inprojvmask, inprojvorog,          &
+        inprojvhurs, inprojvhuss, inprojvqvs, inprojvuas, inprojvvas, inprojvtas, inprojvtds,         &
+        inprojvts, inprojvsst, inprojvps, inprojvpsl, inprojvsnd, inprojvci, inprojvua, inprojvva,    &
+        inprojvta, inprojvtda, inprojvhur, inprojvhus, inprojvqv, inprojvzg, inprojvstl1, inprojvstl2,&
         inprojvstl3, inprojvstl4, inprojvswvl1, inprojvswvl2, inprojvswvl3, inprojvswvl4,             &
         indtimen, indlatn, indlonn, indplevn, indmodlevn, invtimen, invlatn, invlonn, invplevn,       &
         invmodlevn, infconf)
@@ -448,7 +467,7 @@ PROGRAM netcdf2wps
          PRINT *,"  Read projection values from 'namelist.nc2wps' _______"
          PRINT *,'    nrpojs', nprojs
          DO ip=1, nprojs
-           PRINT *,'      values for proejction:', ip
+           PRINT *,'      values for projection:', ip
            PRINT *,'        version: ', version(ip)
            PRINT *,'        xfcst: ',  xfcst(ip)
            PRINT *,'        map_source: ',  TRIM(map_source(ip)), ' iproj: ',  iproj(ip)
@@ -575,13 +594,14 @@ PROGRAM netcdf2wps
          invlonn, invlatn, invtimen, invplevn, invmodlevn,                                            &
          version, xfcst, map_source, iproj, is_wind_grid_rel, startloc, NLg, lonres, latres, centlon, &
          truelat1, truelat2, earth_radius,                                                            &
-         invmaskn, invhursn, invhussn, invqvsn, invuasn, invvasn, invtasn, invtdsn, invtsn, invsstn,  &
-         invpsn, invpsln, invsndn, invcin, invuan, invvan, invtan, invtdan, invhurn, invhusn, invqvn, &
-         invzgn, invstl1n, invstl2n, invstl3n, invstl4n, invswvl1n, invswvl2n, invswvl3n, invswvl4n,  &
-         inprojvmask, inprojvhurs, inprojvhuss, inprojvqvs, inprojvuas, inprojvvas, inprojvtas,       &
-         inprojvtds, inprojvts, inprojvsst, inprojvps, inprojvpsl, inprojvsnd, inprojvci, inprojvua,  &
-         inprojvva, inprojvta, inprojvtda, inprojvhur, inprojvhus,inprojvqv, inprojvzg, inprojvstl1,  &
-         inprojvstl2, inprojvstl3, inprojvstl4, inprojvswvl1, inprojvswvl2, inprojvswvl3,             &
+         invmaskn, invorogn, invhursn, invhussn, invqvsn, invuasn, invvasn, invtasn, invtdsn, invtsn, &
+         invsstn, invpsn, invpsln, invsndn, invcin, invuan, invvan, invtan, invtdan, invhurn, invhusn,&
+         invqvn, invzgn, invstl1n, invstl2n, invstl3n, invstl4n, invswvl1n, invswvl2n, invswvl3n,     &
+         invswvl4n, inptua, inptva, inptta, inpttda, inptqv, inpthur, inpthus, inptzg,                &
+         inprojvmask, inprojvorog, inprojvhurs, inprojvhuss, inprojvqvs, inprojvuas, inprojvvas,      &
+         inprojvtas, inprojvtds, inprojvts, inprojvsst, inprojvps, inprojvpsl, inprojvsnd, inprojvci, &
+         inprojvua, inprojvva, inprojvta, inprojvtda, inprojvhur, inprojvhus,inprojvqv, inprojvzg,    &
+         inprojvstl1, inprojvstl2, inprojvstl3, inprojvstl4, inprojvswvl1, inprojvswvl2, inprojvswvl3,&
          inprojvswvl4, infconf, debug)
 
        IF (debug) THEN
@@ -592,7 +612,7 @@ PROGRAM netcdf2wps
        !! Looping over projections
        !!!!!!!
        Multiproj: DO ip=1, nprojs
-         PRINT *,'  * Processing files in ', ip, ' projection'
+         PRINT *,'  * Processing files in ', ip, ' projection, amount of files', infconf%inNpfile(ip)
          
          CALL InitRun(infconf, ip, infexec)
 
@@ -638,7 +658,10 @@ PROGRAM netcdf2wps
          maxalldimt = MAXVAL(alldimts)
          PRINT *,'  Total amount of times:', tottimes, 'Largest time-values in file: ', maxalldimt
 
-         timelen = infconf%timelenproj(ip)
+         ! Temporal-dependent variables will have timelen depending in which file the time-step is 
+         !   found
+         !timelen = infconf%timelenproj(ip)
+         !timelen = maxalldimt
          latlen = infconf%latlenproj(ip)
          lonlen = infconf%lonlenproj(ip)
          IF (infconf%plevlenproj(ip) /= -1) THEN
@@ -675,10 +698,6 @@ PROGRAM netcdf2wps
          IF (ALLOCATED(sst_mask)) DEALLOCATE(sst_mask)
          ALLOCATE(sst_mask(lonlen,latlen))
          sst_mask = metfillvalue
-         IF (ALLOCATED(time)) DEALLOCATE(time)
-         ALLOCATE(time(timelen))
-         IF (ALLOCATED(intimemat)) DEALLOCATE(intimemat)
-         ALLOCATE(intimemat(6,timelen))
          IF (ALLOCATED(level2Dh)) DEALLOCATE(level2Dh)
          ALLOCATE(level2Dh(lonlen, latlen))
 
@@ -688,6 +707,10 @@ PROGRAM netcdf2wps
            IF (ALLOCATED(sst_mask)) DEALLOCATE(sst_mask)
            ALLOCATE(sst_mask(lonlen,latlen))
          END IF
+         IF (infexec%computeorog) THEN
+           IF (ALLOCATED(orog)) DEALLOCATE(orog)
+           ALLOCATE(orog(lonlen,latlen,1))
+         END IF
          IF (infexec%computehurs) THEN
            IF (ALLOCATED(hurs)) DEALLOCATE(hurs)
            ALLOCATE(hurs(lonlen,latlen,1))
@@ -735,6 +758,10 @@ PROGRAM netcdf2wps
            IF (ALLOCATED(psl)) DEALLOCATE(psl)
            ALLOCATE(psl(lonlen,latlen,1))
          END IF
+         IF (infexec%computeorog .AND. infexec%computeps) THEN
+           IF (ALLOCATED(psl)) DEALLOCATE(psl)
+           ALLOCATE(psl(lonlen,latlen,1))         
+         END IF
          IF (infexec%computesnd) THEN
            IF (ALLOCATED(snd)) DEALLOCATE(snd)
            ALLOCATE(snd(lonlen,latlen,1))
@@ -840,176 +867,31 @@ PROGRAM netcdf2wps
          IF (ALLOCATED(new3d)) DEALLOCATE(new3d)
          ALLOCATE(new3d(lonlen,latlen,levellen,1))
 
-         PRINT*,'***********************************************************'
-         PRINT*,'*************** Getting variable-dimensions ***************'
-         nx=lonlen 
-         ny=latlen 
-
-         attrn = 'units' // TRIM(Nstrings(' ', 25))
-         !Reading Latitude
-         PRINT *,'  Latitude'
-         ncid = search_var(nfs, ncids, TRIM(infconf%invlatn(ip)))
-         vrank = inq_var_rank(ncid, TRIM(infconf%invlatn(ip)))
-         IF (vrank == 1) THEN
-           CALL get_var1D(ncid, latlen, infconf%invlatn(ip), lat)
-           !Checking Latitude order in the dataset
-           PRINT*,'Lat(1): ', lat(1)
-           PRINT*,'lat(',ny,'):', lat(latlen)
-           startlat=lat(1)
-         ELSE IF (vrank == 2) THEN
-           IF (ALLOCATED(var2dA)) DEALLOCATE(var2dA)
-           ALLOCATE(var2dA(lonlen,latlen))
-           CALL get_var2D(ncid, lonlen, latlen, infconf%invlatn(ip), var2dA)
-           !Checking Latitude order in the dataset
-           PRINT*,'Lat(1,1): ', var2dA(1,1)
-           PRINT*,'Lat(',nx,',',ny,'): ',var2dA(lonlen,latlen)
-           startlat=var2dA(1,1)
-         ELSE IF (vrank == 3) THEN
-           IF (ALLOCATED(var3dA)) DEALLOCATE(var3dA)
-           ALLOCATE(var3dA(lonlen,latlen,timelen))
-           CALL get_var3D(ncid, lonlen, latlen, timelen, infconf%invlatn(ip), var3dA)
-           PRINT*,'lat(1,1,1): ', var3dA(1,1,1)
-           PRINT*,'lat(',nx,',',ny,',1): ',var3dA(lonlen,latlen,1)
-           startlat=var3dA(1,1,1)
-         ELSE
-           PRINT *, TRIM(errormsg)
-           PRINT *,"  latgitude variable '" // TRIM(infconf%invlatn(ip)) // "' of rank:", vrank,      &
-             "' not ready !!"
-           PRINT *,'    available ones: 1, 2, 3'
-           STOP "FATAL ERROR"
-         END IF
-
-         !Reading Longitude
-         PRINT *,'  Longitude'
-         ncid = search_var(nfs, ncids, TRIM(infconf%invlonn(ip)))
-         CALL read_dimlength (ncid, TRIM(infconf%indtimen(ip)), timelen)
-         vrank = inq_var_rank(ncid, TRIM(infconf%invlonn(ip)))
-         IF (vrank == 1) THEN
-           CALL get_var1D(ncid, lonlen, infconf%invlonn(ip), lon)
-           !Checking Latitude order in the dataset
-           PRINT*,'Lon(1): ', lon(1)
-           PRINT*,'Lon(',nx,'): ',lon(lonlen)
-           startlon=lon(1)
-         ELSE IF (vrank == 2) THEN
-           CALL get_var2D(ncid, lonlen, latlen, infconf%invlonn(ip), var2dA)
-           !Checking Latitude order in the dataset
-           PRINT*,'Lon(1,1): ', var2dA(1,1)
-           PRINT*,'Lon(',nx,',',ny,'): ',var2dA(lonlen,latlen)
-           startlon=var2dA(1,1)
-         ELSE IF (vrank == 3) THEN
-           CALL get_var3D(ncid, lonlen, latlen, timelen, infconf%invlonn(ip), var3dA)
-           PRINT*,'Lon(1,1,1): ', var3dA(1,1,1)
-           PRINT*,'Lon(',nx,',',ny,',1): ',var3dA(lonlen,latlen,1)
-           startlon=var3dA(1,1,1)
-         ELSE
-           PRINT *, TRIM(errormsg)
-           PRINT *,"  Longitude variable '" // TRIM(infconf%invlonn(ip)) // "' of rank:", vrank,      &
-             "' not ready !!"
-           PRINT *,'    available ones: 1, 2, 3'
-           STOP "FATAL ERROR"
-         END IF
-  
-!Reading Level
-         PRINT *,'Level'
-         IF (ALLOCATED(new1d)) DEALLOCATE(new1d)
-         ALLOCATE(new1d(levellen))
-         IF (TRIM(infconf%indplevn(ip)) /= 'None') THEN
-           ncid = search_var(nfs, ncids, TRIM(infconf%invplevn(ip)))
-           CALL read_dimlength (ncid, TRIM(infconf%indtimen(ip)), timelen)
-           ! Pressure levels might come from wrfpress files with variable name 'P_PL'
-           IF (infconf%invplevn(ip) == 'P_PL') THEN
-             IF (ALLOCATED(var2dA)) DEALLOCATE(var2dA)
-             ALLOCATE(var2dA(levellen, timelen))
-             CALL get_var2D(ncid, levellen, timelen, infconf%invplevn(ip), var2dA)
-             level = var2dA(:,1)
-           ELSE
-             CALL get_var1D(ncid, levellen, infconf%invplevn(ip), level)
-           END IF
-           ! Converting to common CF-conventions p-level units
-           varu = variable_units('press')
-           CALL get_varattr_nfiles(debug, nfs, ncids, infconf%invplevn(ip), attrn, 1, varinu)
-           CALL equal_units1DR(varu, varinu, levellen, level, oper=op, factor=fact,                   &
-             fillvalue=metfillvalue, newvals2=new1d)
-           level = new1d
-
-           ! Checking for the presence of p_top
-           computeptop = .FALSE.
-           IF (p_top /= -9999) THEN
-             leveln = MINVAL(level)
-             IF (REAL(p_top) /= leveln) THEN
-               computeptop = .TRUE.
-               iptop = Index1DArrayR(level, levellen, leveln)
-               PRINT *,"  'p_top' =", p_top, ' higher than the latest level of data in input !!'
-               PRINT *,'    increasing amounf of vertical levels, by introducing p_top'
-               PRINT *,'  3D variables at pres=', p_top, ' Pa will be filled by actual values at ' // &
-                 'the last vertical level ', iptop, ' of the input data at: ', leveln
-               IF (ALLOCATED(levelptop)) DEALLOCATE(levelptop)
-               ALLOCATE(levelptop(levellen+1))
-               levelptop(1:levellen) = level
-               levelptop(levellen+1) = p_top*1. + 1.
-               
-               IF (ALLOCATED(lon2D)) DEALLOCATE(lon2D)
-               ALLOCATE(lon2D(lonlen,latlen))
-               IF (ALLOCATED(lat2D)) DEALLOCATE(lat2D)
-               ALLOCATE(lat2D(lonlen,latlen))
-
-               CALL get_lonlat2D(lonlen, latlen, timelen, nfs, ncids, infconf%invlonn(ip),            &
-                 infconf%invlatn(ip), lon2D, lat2D, debug)
-
-             END IF
-           END IF
-         ELSE
-           ! intpres is only used if there is not a 'indplevn'
-           level = intpres(1:Nintpres)
-         END IF
-
-!         PRINT *,'mod-level'
-!         IF (TRIM(indmodlevn) /= 'None') THEN
-!           IF (ALLOCATED(modpres)) DEALLOCATE(modpres)
-!           ALLOCATE(modpres(lonlen, latlen, modlevellen, timelen))
-!           ! Different options
-!           modplev: IF (invmodlevn(1:7) == 'hybrid:') THEN
-!             CALL compute_hybridp(lonlen, latlen, modlevellen, timelen, invmodlevn, nfs, ncids,      &
-!               modpres)
-!           ELSE
-!             ncid = search_var(nfs, ncids, TRIM(invmodlevn))
-!             CALL read_dimlength (ncid, TRIM(indtimen), timelen)
-!             CALL get_var4D(ncid, lonlen, latlen, modlevellen, timelen, invmodlevn, modpres)
-!             CALL get_varattr_nfiles(debug, nfs, ncids, invmodlevn, attrn, 1, varu)
-!           END IF modplev
-!         !Checking levels order in the dataset
-!         PRINT*,'MOD-L(1):', modlevel(1)
-!         PRINT*,'MODL(', modlevellen, '):', modlevel(levellen)
-!       END IF
-
-!Checking model-levels order in the dataset
-!       PRINT*,'L(', itpt, jtpt, 1, 1, '):', level(itpt,jtpt,1,1)
-!       PRINT*,'L(', itpt, jtpt, levellen, 1, '):', level(itpt,jtpt,levellen,1)
-
 !Reading Time
          PRINT *,'  Time information _______'
          IF (ALLOCATED(alltimes)) DEALLOCATE(alltimes)
          ALLOCATE(alltimes(tottimes))
          iit = 1
-         DO i=1, nfs
-           CALL read_dimlength (ncids(i), TRIM(infconf%indtimen(ip)), timelen)
-           DEALLOCATE(time)
+         DO i=1, infconf%inNpfile(ip)
+           CALL read_dimlength (infconf%inprojncid(ip,i), TRIM(infconf%indtimen(ip)), timelen)
+           IF (ALLOCATED(time)) DEALLOCATE(time)
            ALLOCATE(time(timelen))
            start1d(1) = 1
            count1d(1) = timelen
            PRINT *,'Time'
            IF (TRIM(invtimen(ip)) /= 'WRFtime') THEN
-             !ncid = search_var(nfs, ncids, TRIM(invtimen(ip)))
-             CALL get_var1D(ncids(i), timelen, infconf%invtimen(ip), time)
+             !ncid = search_var(main, nfs, ncids, TRIM(invtimen(ip)))
+             CALL get_var1D(infconf%inprojncid(ip,i), timelen, infconf%invtimen(ip), time)
            ELSE
              PRINT *, TRIM(InfMsg)
              PRINT *,'  ' // TRIM(main) // ": getting time values from WRF's 'Times' variable !!"
              invnA = 'Times'
-             ncid = search_var(nfs, ncids, TRIM(invnA))
-             IF (ALLOCATED(inWRFtimes)) DEALLOCATE(inWRFtimes)
-             ALLOCATE(inWRFtimes(timelen))
-             CALL compute_WRFtimes(ncid, timelen, inWRFtimes)
-             time = inWRFtimes
+             IF (isin_file(infconf%inprojfilen(ip,i), invnA)) THEN
+               IF (ALLOCATED(inWRFtimes)) DEALLOCATE(inWRFtimes)
+               ALLOCATE(inWRFtimes(timelen))
+               CALL compute_WRFtimes(infconf%inprojncid(ip,i), timelen, inWRFtimes)
+               time = inWRFtimes
+             END IF
            END IF
            !Checking time format in the dataset
            PRINT *,'  ', i, "  File: '" // TRIM(infconf%infilens(i)) // "' T(1):", time(1), ' T(',    &
@@ -1019,26 +901,6 @@ PROGRAM netcdf2wps
          END DO
          PRINT *,'  Total times T(1):', alltimes(1), ' T(',tottimes,'):', alltimes(tottimes)
 
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-         PRINT*, '**** Output File Parameters ****' 
-         PRINT*, '  version      = ',version(ip)
-         PRINT*, '  xfcst        = ',xfcst(ip)
-         PRINT*, '  map_source   = ',TRIM(map_source(ip))
-         PRINT*, '  nx           = ',nx
-         PRINT*, '  ny           = ',ny
-         PRINT*, '  iproj        = ',iproj(ip)
-         PRINT*, '  startloc     = ',TRIM(startloc(ip))
-         PRINT*, '  startlat     = ',startlat
-         PRINT*, '  startlon     = ',startlon
-         PRINT*, '  NLg          = ',NLg(ip)
-         PRINT*, '  lonres       = ',lonres(ip)
-         PRINT*, '  latres       = ',latres(ip)
-         PRINT*, '  central longitude =', centlon(ip)
-         PRINT*, '  truelat1     = ',truelat1(ip)
-         PRINT*, '  truelat2     = ',truelat2(ip)
-         PRINT*, '  earth_radius = ',earth_radius(ip)
-         PRINT*, '  wind_rotation= ',is_wind_grid_rel(ip)
-
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!   
 
 !        !
@@ -1059,6 +921,8 @@ PROGRAM netcdf2wps
          !output="/homedata/snamendra/WPS/data/FILE:"//date_out1
 
          ! Soil temperature, we want to compute (if necessary) it only once (not memory efficient !!)
+         attrn = 'units' // TRIM(Nstrings(' ', 25))
+
          IF (infexec%computestl1) THEN
            IF (TRIM(infconf%invstl1n) == 'WRFstl') THEN
              Ndpths = 4
@@ -1067,7 +931,7 @@ PROGRAM netcdf2wps
              dpths = (/ 0.035, 0.385, 0.64, 1.775 /)
 
              invnA = 'TSLB'
-             CALL multisearch_var(debug, nfs, ncids, TRIM(invnA), Nfvar, ffilens, fncids)
+             CALL multisearch_var(debug, main, nfs, ncids, TRIM(invnA), Nfvar, ffilens, fncids)
              PRINT *, TRIM(infmsg)
              PRINT *, "  Computing 'stl' from WRF's 'TSLB' found at units ", fncids(1:Nfvar)
              IF (ALLOCATED(dimts)) DEALLOCATE(dimts)
@@ -1086,7 +950,8 @@ PROGRAM netcdf2wps
                ALLOCATE(WRFstl(lonlen, latlen, Ndpths, dimts(i)))
                IF (ALLOCATED(new4d)) DEALLOCATE(new4d)
                ALLOCATE(new4d(lonlen, latlen, Ndpths, dimts(i)))
-               CALL compute_WRFstl(fncids(i), lonlen, latlen, dimts(i), Ndpths, dpths, WRFstl)
+               CALL compute_WRFstl(nfs, ncids, fncids(i), lonlen, latlen, dimts(i), indnB, Ndpths, dpths,    &
+                 WRFstl)
 
                CALL get_varattr(fncids(i), invnA, attrn, 1, varinu)
                CALL equal_units4DR(varu, varinu, lonlen, latlen, Ndpths, dimts(i), WRFstl, oper=op,   &
@@ -1117,7 +982,7 @@ PROGRAM netcdf2wps
 
              IF (landproj == ip) THEN
 
-               CALL multisearch_var(debug, nfiles, allncids, TRIM(invnA), Nfvar, ffilens, fncids)
+               CALL multisearch_var(debug, main, nfiles, allncids, TRIM(invnA), Nfvar, ffilens, fncids)
 
                indnB = indtimen(ip)
                IF (ALLOCATED(dimts)) DEALLOCATE(dimts)
@@ -1188,7 +1053,7 @@ PROGRAM netcdf2wps
              lays(:,4) = (/ 1.00, 2.55 /)
 
              invnA = 'SMOIS'
-             CALL multisearch_var(debug, nfs, ncids, TRIM(invnA), Nfvar, ffilens, fncids)
+             CALL multisearch_var(debug, main, nfs, ncids, TRIM(invnA), Nfvar, ffilens, fncids)
              PRINT *, TRIM(infmsg)
              PRINT *, "  Computing 'swvl' from WRF's 'SMOIS' found at unit ", fncids(1:Nfvar)
              IF (ALLOCATED(dimts)) DEALLOCATE(dimts)
@@ -1207,7 +1072,8 @@ PROGRAM netcdf2wps
                IF (ALLOCATED(new4d)) DEALLOCATE(new4d)
                ALLOCATE(new4d(lonlen, latlen, Ndpths, dimts(i)))
 
-               CALL compute_WRFswvl(fncids(i), lonlen, latlen, dimts(i), Ndpths, lays, WRFswvl)
+               CALL compute_WRFswvl(nfs, ncids,fncids(i), lonlen, latlen, dimts(i), indnB,Ndpths,     &
+                 lays, WRFswvl)
                varu = variable_units('swvl1')
                CALL get_varattr(fncids(i), invnA, attrn, dimts(i), varinu)
                CALL equal_units4DR(varu, varinu, lonlen, latlen, Ndpths, dimts(i), WRFswvl, oper=op,  &
@@ -1237,7 +1103,7 @@ PROGRAM netcdf2wps
 
              IF (landproj == ip) THEN
 
-               CALL multisearch_var(debug, nfiles, allncids, TRIM(invnA), Nfvar, ffilens, fncids)
+               CALL multisearch_var(debug, main, nfiles, allncids, TRIM(invnA), Nfvar, ffilens, fncids)
 
                indnB = indtimen(ip)
                IF (ALLOCATED(dimts)) DEALLOCATE(dimts)
@@ -1308,7 +1174,14 @@ PROGRAM netcdf2wps
            CALL stoprun(msg, main)
          END IF
 
+         nx=lonlen 
+         ny=latlen 
+
+         !! 
+         ! Temporal loop
+         !! 
          ALLOCATE(slab(nx,ny)) 
+         PRINT *," ******* Starting temporal loop ****** ***** **** *** ** *"
          time_steps: DO t=1,Nodates
 
            WRITE(cyy,'(i4.4)') oDs(t,1)
@@ -1320,10 +1193,238 @@ PROGRAM netcdf2wps
 
            date_out1 = cyy//'-'//cmm//'-'//cdd//'_'//chh1
            date_out = cyy//'-'//cmm//'-'//cdd//'_'//chh1//':'//mii//':'//sii
+           IF (TRIM(invtimen(ip)) /= 'WRFtime') THEN
+             CALL get_var_equivmultitimes(debug, infconf, infconf%inprojvars(ip,1), ip, oDs(t,:),     &
+               maxtimediff, inc, ncid, ncit, foundfilen)
+           ELSE
+             CALL get_var_equivmultiWRFtimes(debug, infconf, infconf%inprojvars(ip,1), ip, oDs(t,:),  &
+               maxtimediff, inc, ncidfound, ncit, foundfilen)
+           END IF
+           CALL read_dimlength (ncidfound, TRIM(indtimen(ip)), timelen)
+           PRINT *, t, ':', TRIM(date_out), " file name '" // TRIM(foundfilen) // "' unit: " //       &
+               ItoS(ncidfound) // " time-step: " // ItoS(ncit)
+           
+           IF (ALLOCATED(time)) DEALLOCATE(time)
+           ALLOCATE(time(timelen))
+           IF (ALLOCATED(intimemat)) DEALLOCATE(intimemat)
+           ALLOCATE(intimemat(6,timelen))
+
+           PRINT*,'***********************************************************'
+           PRINT*,'*************** Getting variable-dimensions ***************'
+
+           PRINT *,'  Dimensions dx, dy, dz, dt:',  nx, ny, levellen, timelen
+
+           !Reading Latitude
+           PRINT *,'  Latitude'
+           IF (.NOT.isin_file(foundfilen, TRIM(infconf%invlatn(ip)) )) THEN
+             ncid0 = search_var(main, nfs, ncids, TRIM(infconf%invlatn(ip)))
+             CALL read_dimlength (ncid0, TRIM(infconf%indtimen(ip)), timelen)
+             ncid = ncid0
+             PRINT *, '    ' // ": latitude named '" // TRIM(infconf%invlatn(ip)) //                  &
+               "' not found in '" // TRIM(foundfilen) // "' !!"
+             PRINT *, '    ' // " using netcdf id " // TRIM(ItoS(ncid0)) // " time length: ", timelen 
+           ELSE
+             ncid = ncidfound
+           END IF
+           PRINT *,'   Lluis getting rank ....'
+           vrank = inq_var_rank(ncid, TRIM(infconf%invlatn(ip)))
+           PRINT *,'   vrank:', vrank
+           IF (vrank == 1) THEN
+             CALL get_var1D(ncid, latlen, infconf%invlatn(ip), lat)
+             !Checking Latitude order in the dataset
+             PRINT*,'Lat(1): ', lat(1)
+             PRINT*,'lat(',ny,'):', lat(latlen)
+             startlat=lat(1)
+           ELSE IF (vrank == 2) THEN
+             IF (ALLOCATED(var2dA)) DEALLOCATE(var2dA)
+             ALLOCATE(var2dA(lonlen,latlen))
+             CALL get_var2D(ncid, lonlen, latlen, infconf%invlatn(ip), var2dA)
+             !Checking Latitude order in the dataset
+             PRINT*,'Lat(1,1): ', var2dA(1,1)
+             PRINT*,'Lat(',nx,',',ny,'): ',var2dA(lonlen,latlen)
+             startlat=var2dA(1,1)
+           ELSE IF (vrank == 3) THEN
+             IF (ALLOCATED(var3dA)) DEALLOCATE(var3dA)
+             ALLOCATE(var3dA(lonlen,latlen,timelen))
+             CALL get_var3D(ncid, lonlen, latlen, timelen, infconf%invlatn(ip), var3dA)
+             PRINT*,'lat(1,1,1): ', var3dA(1,1,1)
+             PRINT*,'lat(',nx,',',ny,',1): ',var3dA(lonlen,latlen,1)
+             startlat=var3dA(1,1,1)
+           ELSE
+             PRINT *, TRIM(errormsg)
+             PRINT *,"  latgitude variable '" // TRIM(infconf%invlatn(ip)) // "' of rank:", vrank,      &
+               "' not ready !!"
+             PRINT *,'    available ones: 1, 2, 3'
+             STOP "FATAL ERROR"
+           END IF
+
+           !Reading Longitude
+           PRINT *,'  Longitude'
+           IF (.NOT.isin_file(foundfilen, TRIM(infconf%invlatn(ip)) )) THEN
+             ncid0 = search_var(main, nfs, ncids, TRIM(infconf%invlonn(ip)))
+             CALL read_dimlength (ncid0, TRIM(infconf%indtimen(ip)), timelen)
+             ncid = ncid0
+           ELSE
+             ncid = ncidfound
+           END IF
+           vrank = inq_var_rank(ncid, TRIM(infconf%invlonn(ip)))
+           IF (vrank == 1) THEN
+             CALL get_var1D(ncid, lonlen, infconf%invlonn(ip), lon)
+             !Checking Longitude order in the dataset
+             PRINT*,'Lon(1): ', lon(1)
+             PRINT*,'Lon(',nx,'): ',lon(lonlen)
+             startlon=lon(1)
+           ELSE IF (vrank == 2) THEN
+             CALL get_var2D(ncid, lonlen, latlen, infconf%invlonn(ip), var2dA)
+             !Checking Longitude order in the dataset
+             PRINT*,'Lon(1,1): ', var2dA(1,1)
+             PRINT*,'Lon(',nx,',',ny,'): ',var2dA(lonlen,latlen)
+             startlon=var2dA(1,1)
+           ELSE IF (vrank == 3) THEN
+             CALL get_var3D(ncid, lonlen, latlen, timelen, infconf%invlonn(ip), var3dA)
+             PRINT*,'Lon(1,1,1): ', var3dA(1,1,1)
+             PRINT*,'Lon(',nx,',',ny,',1): ',var3dA(lonlen,latlen,1)
+             startlon=var3dA(1,1,1)
+           ELSE
+             PRINT *, TRIM(errormsg)
+             PRINT *,"  Longitude variable '" // TRIM(infconf%invlonn(ip)) // "' of rank:", vrank,      &
+               "' not ready !!"
+             PRINT *,'    available ones: 1, 2, 3'
+             STOP "FATAL ERROR"
+           END IF
+  
+!Reading Level
+           PRINT *,'Level'
+           IF (ALLOCATED(new1d)) DEALLOCATE(new1d)
+           ALLOCATE(new1d(levellen))
+           IF (TRIM(infconf%indplevn(ip)) /= 'None') THEN
+             IF (.NOT.isin_file(foundfilen, TRIM(infconf%invplevn(ip)) )) THEN
+               ncid0 = search_var(main, nfs, ncids, TRIM(infconf%invplevn(ip)))
+               CALL read_dimlength (ncid0, TRIM(infconf%indtimen(ip)), timelen)
+             ELSE
+               ncid = ncidfound
+             END IF
+             ! Pressure levels might come from wrfpress files with variable name 'P_PL'
+             IF (infconf%invplevn(ip) == 'P_PL') THEN
+               IF (ALLOCATED(var2dA)) DEALLOCATE(var2dA)
+               ALLOCATE(var2dA(levellen, timelen))
+               CALL get_var2D(ncid, levellen, timelen, infconf%invplevn(ip), var2dA)
+               level = var2dA(:,1)
+             ELSE
+               CALL get_var1D(ncid, levellen, infconf%invplevn(ip), level)
+             END IF
+             ! Converting to common CF-conventions p-level units
+             varu = variable_units('press')
+             CALL get_varattr_nfiles(debug, nfs, ncids, infconf%invplevn(ip), attrn, 1, varinu)
+             CALL equal_units1DR(varu, varinu, levellen, level, oper=op, factor=fact,                   &
+               fillvalue=metfillvalue, newvals2=new1d)
+             level = new1d
+  
+             ! Checking for the presence of p_top
+             computeptop = .FALSE.
+             IF (p_top /= -9999) THEN
+               leveln = MINVAL(level)
+               IF (REAL(p_top) /= leveln) THEN
+                 computeptop = .TRUE.
+                 iptop = Index1DArrayR(level, levellen, leveln)
+                 PRINT *,"  'p_top' =", p_top, ' higher than the latest level of data in input !!'
+                 PRINT *,'    increasing amounf of vertical levels, by introducing p_top'
+                 PRINT *,'  3D variables at pres=', p_top, ' Pa will be filled by actual values at ' // &
+                   'the last vertical level ', iptop, ' of the input data at: ', leveln
+                 IF (ALLOCATED(levelptop)) DEALLOCATE(levelptop)
+                 ALLOCATE(levelptop(levellen+1))
+                 levelptop(1:levellen) = level
+                 levelptop(levellen+1) = p_top*1. + 1.
+                 
+                 IF (ALLOCATED(lon2D)) DEALLOCATE(lon2D)
+                 ALLOCATE(lon2D(lonlen,latlen))
+                 IF (ALLOCATED(lat2D)) DEALLOCATE(lat2D)
+                 ALLOCATE(lat2D(lonlen,latlen))
+  
+                 CALL get_lonlat2D(lonlen, latlen, timelen, nfs, ncids, infconf%invlonn(ip),            &
+                   infconf%invlatn(ip), lon2D, lat2D, debug)
+  
+               END IF
+             END IF
+           ELSE
+             ! intpres is only used if there is not a 'indplevn'
+             level = intpres(1:Nintpres)
+           END IF
+
+!           PRINT *,'mod-level'
+!           IF (TRIM(indmodlevn) /= 'None') THEN
+!             IF (ALLOCATED(modpres)) DEALLOCATE(modpres)
+!             ALLOCATE(modpres(lonlen, latlen, modlevellen, timelen))
+!             ! Different options
+!             modplev: IF (invmodlevn(1:7) == 'hybrid:') THEN
+!               CALL compute_hybridp(lonlen, latlen, modlevellen, timelen, invmodlevn, nfs, ncids,      &
+!                 modpres)
+!             ELSE
+!               ncid = search_var(main, nfs, ncids, TRIM(invmodlevn))
+!               CALL read_dimlength (ncid, TRIM(indtimen), timelen)
+!               CALL get_var4D(ncid, lonlen, latlen, modlevellen, timelen, invmodlevn, modpres)
+!               CALL get_varattr_nfiles(debug, nfs, ncids, invmodlevn, attrn, 1, varu)
+!             END IF modplev
+!           !Checking levels order in the dataset
+!           PRINT*,'MOD-L(1):', modlevel(1)
+!           PRINT*,'MODL(', modlevellen, '):', modlevel(levellen)
+!         END IF
+
+!Checking model-levels order in the dataset
+!         PRINT*,'L(', itpt, jtpt, 1, 1, '):', level(itpt,jtpt,1,1)
+!         PRINT*,'L(', itpt, jtpt, levellen, 1, '):', level(itpt,jtpt,levellen,1)
 
-           PRINT *, t, ':', TRIM(date_out)
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+           IF (t == 1) THEN
+             PRINT*, '**** Output File Parameters ****' 
+             PRINT*, '  version      = ',version(ip)
+             PRINT*, '  xfcst        = ',xfcst(ip)
+             PRINT*, '  map_source   = ',TRIM(map_source(ip))
+             PRINT*, '  nx           = ',nx
+             PRINT*, '  ny           = ',ny
+             PRINT*, '  iproj        = ',iproj(ip)
+             PRINT*, '  startloc     = ',TRIM(startloc(ip))
+             PRINT*, '  startlat     = ',startlat
+             PRINT*, '  startlon     = ',startlon
+             PRINT*, '  NLg          = ',NLg(ip)
+             PRINT*, '  lonres       = ',lonres(ip)
+             PRINT*, '  latres       = ',latres(ip)
+             PRINT*, '  central longitude =', centlon(ip)
+             PRINT*, '  truelat1     = ',truelat1(ip)
+             PRINT*, '  truelat2     = ',truelat2(ip)
+             PRINT*, '  earth_radius = ',earth_radius(ip)
+             PRINT*, '  wind_rotation= ',is_wind_grid_rel(ip)
+         
+             ! Checking consistency of debugging grid points
+             IF (itpt > lonlen) THEN
+               msg='Testing itpt: ' // TRIM(ItoS(itpt)) // ' to large for dimx: ' // TRIM(ItoS(lonlen))
+               CALL stoprun(msg, main)
+             END IF
+             IF (jtpt > latlen) THEN
+               msg='Testing jtpt: ' // TRIM(ItoS(jtpt)) // ' to large for dimy: ' // TRIM(ItoS(latlen))
+               CALL stoprun(msg, main)
+             END IF
+             IF (TRIM(infconf%indplevn(ip)) /= 'None') THEN
+               IF (ktpt > levellen) THEN
+                 msg='Testing ktpt: '//TRIM(ItoS(ktpt))//' to large for dimz: ' // TRIM(ItoS(levellen))
+                 CALL stoprun(msg, main)
+               END IF
+             ELSE
+               IF (ktpt > modlevellen) THEN
+                 msg='Testing ktpt: '//TRIM(ItoS(ktpt))//' to large for dimz: '//TRIM(ItoS(modlevellen))
+                 CALL stoprun(msg, main)
+               END IF         
+             END IF
+             IF (ltpt > timelen) THEN
+               msg='Testing ltpt: ' // TRIM(ItoS(ltpt)) // ' to large for dimt: ' // TRIM(ItoS(timelen))
+               CALL stoprun(msg, main)
+             END IF
+           END IF
 
+           ncid = ncidfound
+        
            IF (infexec%computemask) sst_mask = 0.
+           IF (infexec%computeorog) orog = 0.
            IF (infexec%computehurs) hurs = 0.
            IF (infexec%computehuss) huss = 0.
            IF (infexec%computeqvs) qvs = 0.
@@ -1367,24 +1468,46 @@ PROGRAM netcdf2wps
            PRINT*,'**************************************************'
            PRINT*,'******* Reading 3D Variables(lon,lat,time) *******'
 
+           IF (infexec%computeorog) THEN
+             PRINT *,'Orography'
+             ncid = search_var(main, nfs, ncids, TRIM(infconf%invorogn))
+             vrank = inq_var_rank(ncid, TRIM(infconf%invorogn))
+             IF (vrank == 2) THEN
+               CALL get_var2D(ncid, lonlen, latlen, infconf%invorogn, var2dA)
+               orog(:,:,1) = var2dA
+             ELSE IF (vrank == 3) THEN         
+               CALL get_2Dfield(debug, nfs, ncids, infconf%invorogn, 'orog', infconf%indtimen(ip),    &
+                 infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, orog)
+               varu = variable_units('orog')
+               CALL get_varattr_nfiles(debug, nfs, ncids, infconf%invorogn, attrn, 1, varinu)
+               CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, orog, oper=op, factor=fact,       &
+                 fillvalue=metfillvalue, newvals2=new2d)
+               orog = new2d
+             ELSE
+               msg = "Orography variable '" // TRIM(infconf%invorogn) // "' of rank: " //             &
+                 TRIM(ItoS(vrank)) // " not ready !! Only 2D and 3D are available"
+               CALL StopRun(msg, main)
+             END IF
+           END IF
+
            IF (infexec%computehurs) THEN
              PRINT *,'2m relative humidity'
-             CALL get_2Dfield(debug, nfs, ncids, infconf%invhursn, 'hurs', infconf%indtimen(ip),   &
+             CALL get_2Dfield(debug, nfs, ncids, infconf%invhursn, 'hurs', infconf%indtimen(ip),      &
                infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, hurs)
              varu = variable_units('hurs')
              CALL get_varattr_nfiles(debug, nfs, ncids, infconf%invhursn, attrn, 1, varinu)
-             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, hurs, oper=op, factor=fact,            &
+             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, hurs, oper=op, factor=fact,         &
                fillvalue=metfillvalue, newvals2=new2d)
              hurs = new2d
            END IF
 
            IF (infexec%computehuss) THEN
              PRINT *,'2m specific humidity'
-             CALL get_2Dfield(debug, nfs, ncids, infconf%invhussn, 'huss', infconf%indtimen(ip),   &
+             CALL get_2Dfield(debug, nfs, ncids, infconf%invhussn, 'huss', infconf%indtimen(ip),      &
                infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, huss)
              varu = variable_units('huss')
              CALL get_varattr_nfiles(debug, nfs, ncids, infconf%invhussn, attrn, 1, varinu)
-             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, huss, oper=op, factor=fact,            &
+             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, huss, oper=op, factor=fact,         &
                fillvalue=metfillvalue, newvals2=new2d)
              huss = new2d
              IF (TRIM(infconf%invqvsn) == 'None') THEN
@@ -1404,55 +1527,55 @@ PROGRAM netcdf2wps
 
            IF (infexec%computeqvs) THEN
              PRINT *,'2m water vapour mixing ratio'
-             CALL get_2Dfield(debug, nfs, ncids, infconf%invqvsn, 'qvs', infconf%indtimen(ip),   &
+             CALL get_2Dfield(debug, nfs, ncids, infconf%invqvsn, 'qvs', infconf%indtimen(ip),        &
                infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, qvs)
              varu = variable_units('qvs')
              CALL get_varattr_nfiles(debug, nfs, ncids, infconf%invqvsn, attrn, 1, varinu)
-             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, qvs, oper=op, factor=fact,            &
+             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, qvs, oper=op, factor=fact,          &
                fillvalue=metfillvalue, newvals2=new2d)
              qvs = new2d
            END IF
 
            IF (infexec%computeuas) THEN
              PRINT *,'10m eastward wind speed'
-             CALL get_2Dfield(debug, nfs, ncids, infconf%invuasn, 'uas', infconf%indtimen(ip),   &
+             CALL get_2Dfield(debug, nfs, ncids, infconf%invuasn, 'uas', infconf%indtimen(ip),        &
                infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, uas)
              varu = variable_units('uas')
              CALL get_varattr_nfiles(debug, nfs, ncids, infconf%invuasn, attrn, 1, varinu)
-             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, uas, oper=op, factor=fact,            &
+             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, uas, oper=op, factor=fact,          &
                fillvalue=metfillvalue, newvals2=new2d)
              uas = new2d
            END IF
 
            IF (infexec%computevas) THEN
              PRINT *,'10m northward wind speed'
-             CALL get_2Dfield(debug, nfs, ncids, infconf%invvasn, 'vas', infconf%indtimen(ip),   &
+             CALL get_2Dfield(debug, nfs, ncids, infconf%invvasn, 'vas', infconf%indtimen(ip),        &
                infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, vas)
              varu = variable_units('vas')
              CALL get_varattr_nfiles(debug, nfs, ncids, infconf%invvasn, attrn, 1, varinu)
-             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, vas, oper=op, factor=fact,            &
+             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, vas, oper=op, factor=fact,          &
                fillvalue=metfillvalue, newvals2=new2d)
              vas = new2d
            END IF
 
            IF (infexec%computetas) THEN
              PRINT *,'2m air-temperature'
-             CALL get_2Dfield(debug, nfs, ncids, infconf%invtasn, 'tas', infconf%indtimen(ip),   &
+             CALL get_2Dfield(debug, nfs, ncids, infconf%invtasn, 'tas', infconf%indtimen(ip),        &
                infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, tas)
              varu = variable_units('tas')
              CALL get_varattr_nfiles(debug, nfs, ncids, infconf%invtasn, attrn, 1, varinu)
-             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, tas, oper=op, factor=fact,            &
+             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, tas, oper=op, factor=fact,          &
                fillvalue=metfillvalue, newvals2=new2d)
              tas = new2d
            END IF
 
            IF (infexec%computetds) THEN
              PRINT *,'2m dew-point temperature'
-             CALL get_2Dfield(debug, nfs, ncids, infconf%invtdsn, 'tds', infconf%indtimen(ip),   &
+             CALL get_2Dfield(debug, nfs, ncids, infconf%invtdsn, 'tds', infconf%indtimen(ip),        &
                infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, tds)
              varu = variable_units('tds')
              CALL get_varattr_nfiles(debug, nfs, ncids, infconf%invtdsn, attrn, 1, varinu)
-             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, tds, oper=op, factor=fact,            &
+             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, tds, oper=op, factor=fact,          &
                fillvalue=metfillvalue, newvals2=new2d)
              tds = new2d
              ! Imposing the computation of the hurss / qvs
@@ -1466,55 +1589,55 @@ PROGRAM netcdf2wps
 
            IF (infexec%computets) THEN
              PRINT *,'skin temperature'
-             CALL get_2Dfield(debug, nfs, ncids, infconf%invtsn, 'ts', infconf%indtimen(ip),   &
+             CALL get_2Dfield(debug, nfs, ncids, infconf%invtsn, 'ts', infconf%indtimen(ip),          &
                infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, ts)
              varu = variable_units('ts')
              CALL get_varattr_nfiles(debug, nfs, ncids, infconf%invtsn, attrn, 1, varinu)
-             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, ts, oper=op, factor=fact,            &
+             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, ts, oper=op, factor=fact,           &
                fillvalue=metfillvalue, newvals2=new2d)
              ts = new2d
            END IF
 
            IF (infexec%computesst) THEN
              PRINT *,'sea surface temperature'
-             CALL get_2Dfield(debug, nfs, ncids, infconf%invsstn, 'sst', infconf%indtimen(ip),   &
+             CALL get_2Dfield(debug, nfs, ncids, infconf%invsstn, 'sst', infconf%indtimen(ip),        &
                infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, sst)
              varu = variable_units('sst')
              CALL get_varattr_nfiles(debug, nfs, ncids, infconf%invsstn, attrn, 1, varinu)
-             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, sst, oper=op, factor=fact,            &
+             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, sst, oper=op, factor=fact,          &
                fillvalue=metfillvalue, newvals2=new2d)
              sst = new2d
            END IF
 
            IF (infexec%computeps) THEN
              PRINT *,'surface pressure'
-             CALL get_2Dfield(debug, nfs, ncids, infconf%invpsn, 'ps', infconf%indtimen(ip),   &
+             CALL get_2Dfield(debug, nfs, ncids, infconf%invpsn, 'ps', infconf%indtimen(ip),          &
                infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, ps)
              varu = variable_units('ps')
              CALL get_varattr_nfiles(debug, nfs, ncids, infconf%invpsn, attrn, 1, varinu)
-             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, ps, oper=op, factor=fact,            &
+             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, ps, oper=op, factor=fact,           &
                fillvalue=metfillvalue, newvals2=new2d)
              ps = new2d
            END IF
 
            IF (infexec%computepsl) THEN
              PRINT *,'sea-level pressure'
-             CALL get_2Dfield(debug, nfs, ncids, infconf%invpsln, 'psl', infconf%indtimen(ip),   &
+             CALL get_2Dfield(debug, nfs, ncids, infconf%invpsln, 'psl', infconf%indtimen(ip),        &
                infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, psl)
              varu = variable_units('psl')
              CALL get_varattr_nfiles(debug, nfs, ncids, infconf%invpsln, attrn, 1, varinu)
-             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, psl, oper=op, factor=fact,            &
+             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, psl, oper=op, factor=fact,          &
                fillvalue=metfillvalue, newvals2=new2d)
              psl = new2d
            END IF
 
            IF (infexec%computesnd) THEN
              PRINT *,'snow thickness'
-             CALL get_2Dfield(debug, nfs, ncids, infconf%invsndn, 'snd', infconf%indtimen(ip),   &
+             CALL get_2Dfield(debug, nfs, ncids, infconf%invsndn, 'snd', infconf%indtimen(ip),        &
                infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, snd)
              varu = variable_units('snd')
              CALL get_varattr_nfiles(debug, nfs, ncids, infconf%invsndn, attrn, 1, varinu)
-             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, snd, oper=op, factor=fact,            &
+             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, snd, oper=op, factor=fact,          &
                fillvalue=metfillvalue, newvals2=new2d)
              snd = new2d
              ! Computing various diagnostics after ungrib/src/rrpr.F
@@ -1529,7 +1652,7 @@ PROGRAM netcdf2wps
                END IF
                snh = sn*0.005
              ELSE
-               msg = "I do not know how to compute now height using map_source= '" //                   &
+               msg = "I do not know how to compute now height using map_source= '" //                 &
                  TRIM(map_source(ip)) // "' "
                PRINT *,TRIM(msg)
              END IF
@@ -1537,11 +1660,11 @@ PROGRAM netcdf2wps
 
            IF (infexec%computeci) THEN
              PRINT *,'sea-ice cover'
-             CALL get_2Dfield(debug, nfs, ncids, infconf%invcin, 'ci', infconf%indtimen(ip),   &
+             CALL get_2Dfield(debug, nfs, ncids, infconf%invcin, 'ci', infconf%indtimen(ip),          &
                infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, ci)
              varu = variable_units('ci')
              CALL get_varattr_nfiles(debug, nfs, ncids, infconf%invcin, attrn, 1, varinu)
-             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, ci, oper=op, factor=fact,            &
+             CALL equal_units3DR(varu, varinu, lonlen, latlen, 1, ci, oper=op, factor=fact,           &
                fillvalue=metfillvalue, newvals2=new2d)
              ci = new2d
            END IF
@@ -1552,16 +1675,25 @@ PROGRAM netcdf2wps
            IF (infexec%computemask) THEN
              PRINT *,'land/sea mask (1: land, 0: sea)'
              IF (TRIM(infconf%invmaskn) /= 'varVland') THEN
-               IF (vrank == 3) THEN
-                 CALL get_3Dfield(debug, nfs, ncids, infconf%invmaskn, 'landseamask',                   &
-                   infconf%indtimen(ip), infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen,   &
-                   timelen, var3dA)
+               ncid = search_var(main, nfiles, allncids, TRIM(infconf%invmaskn))
+               vrank = inq_var_rank(ncid, TRIM(infconf%invmaskn))
+               IF (vrank == 4) THEN
+                 CALL get_3Dfield(debug, nfs, ncids, infconf%invmaskn, 'landsea',                     &
+                   infconf%indtimen(ip), infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, &
+                   timelen, var4dA)
+                 sst_mask = var4dA(:,:,1,1)
+               ELSE IF (vrank == 3) THEN
+                 CALL get_2Dfield(debug, nfs, ncids, infconf%invmaskn, 'landsea',                     &
+                   infconf%indtimen(ip), infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, &
+                   var3dA)
                  sst_mask = var3dA(:,:,1)
                ELSE
                  start2d = (/ 1, 1 /)
                  CALL get_var2D_slice(ncid, lonlen, latlen, start2d, invmaskn, sst_mask)
                END IF
                ! Modifying_FillValue
+               IF (ALLOCATED(new2d1)) DEALLOCATE(new2d1)
+               ALLOCATE(new2d1(lonlen,latlen))
                CALL modify2D_fillValue(ncid, invmaskn, metfillvalue, lonlen, latlen, sst_mask, new2d1)
                sst_mask = new2d1
                varu = variable_units('landsea')
@@ -1583,7 +1715,7 @@ PROGRAM netcdf2wps
                READ(landvvals(3), '(F20.10)')landvvalue
                landoper = TRIM(landvvals(4))
   
-               ncid = search_var(nfiles, allncids, TRIM(landvname))
+               ncid = search_var(main, nfiles, allncids, TRIM(landvname))
                PRINT *, '  Creation of land/sea mask from variable values'
                vrank = inq_var_rank(ncid, TRIM(landvname))
                IF (vrank == 4) THEN
@@ -1605,7 +1737,7 @@ PROGRAM netcdf2wps
                  PRINT *,'    Using fillvalue as land point'
                END IF
 
-               PRINT *,"    Using '", TRIM(landvname), "' as land point with " // TRIM(landoper) // &
+               PRINT *,"    Using '", TRIM(landvname), "' as land point with " // TRIM(landoper) //   &
                  ' ', landvvalue
                IF (TRIM(landoper) == 'eq') THEN
                  DO i=1,lonlen
@@ -1666,7 +1798,7 @@ PROGRAM netcdf2wps
              count4d = (/ lonlen, latlen, 1, 1 /)
              PRINT *,'Soil temperature layer 1'
              IF (TRIM(infconf%invstl1n) == 'WRFstl') THEN
-               CALL multisearch_var(debug, nfs, ncids, 'TSLB', Nfvar, ffilens, fncids)
+               CALL multisearch_var(debug, main, nfs, ncids, 'TSLB', Nfvar, ffilens, fncids)
                CALL get_equivmultiWRFtimes(Nfvar, fncids(1:Nfvar), oDs(t,:), maxtimediff, ifile, ncid,&
                  indate)
                inc = Index1DArrayI(fncids(1:Nfvar), Nfvar, ncid)
@@ -1676,7 +1808,7 @@ PROGRAM netcdf2wps
                landproj = Iwithin_csvStr(tskextrap, ',', 3)
                invnA = TRIM(Swithin_csvStr(tskextrap, ',', 2))
                IF (landproj == ip) THEN
-                 CALL multisearch_var(debug, nfiles, allncids, invnA, Nfvar, ffilens, fncids)
+                 CALL multisearch_var(debug, main, nfiles, allncids, invnA, Nfvar, ffilens, fncids)
                  CALL get_equivmultitimes(Nfvar, fncids(1:Nfvar), infconf%indtimen(ip),               &               
                    infconf%invtimen(ip), oDs(t,:), maxtimediff, inc, ncid, indate, debug)
                  IF (debug) PRINT *,"    Filling 'stl1' with extrapolated values from ts labelled '"  &
@@ -1707,7 +1839,7 @@ PROGRAM netcdf2wps
              count4d = (/ lonlen, latlen, 1, 1 /)
              PRINT *,'Soil temperature layer 2'
              IF (TRIM(infconf%invstl1n) == 'WRFstl') THEN
-               CALL multisearch_var(debug, nfs, ncids, 'TSLB', Nfvar, ffilens, fncids)
+               CALL multisearch_var(debug, main, nfs, ncids, 'TSLB', Nfvar, ffilens, fncids)
                CALL get_equivmultiWRFtimes(Nfvar, fncids(1:Nfvar), oDs(t,:), maxtimediff, ifile, ncid,&
                  indate)
                inc = Index1DArrayI(fncids(1:Nfvar), Nfvar, ncid)
@@ -1717,7 +1849,7 @@ PROGRAM netcdf2wps
                landproj = Iwithin_csvStr(tskextrap, ',', 3)
                invnA = TRIM(Swithin_csvStr(tskextrap, ',', 2))
                IF (landproj == ip) THEN
-                 CALL multisearch_var(debug, nfiles, allncids, invnA, Nfvar, ffilens, fncids)
+                 CALL multisearch_var(debug, main, nfiles, allncids, invnA, Nfvar, ffilens, fncids)
                  CALL get_equivmultitimes(Nfvar, fncids(1:Nfvar), infconf%indtimen(ip),               &               
                    infconf%invtimen(ip), oDs(t,:), maxtimediff, inc, ncid, indate, debug)
                  IF (debug) PRINT *,"    Filling 'stl2' with extrapolated values from ts labelled '"  &
@@ -1737,7 +1869,7 @@ PROGRAM netcdf2wps
              count4d = (/ lonlen, latlen, 1, 1 /)
              PRINT *,'Soil temperature layer 3'
              IF (TRIM(infconf%invstl1n) == 'WRFstl') THEN
-               CALL multisearch_var(debug, nfs, ncids, 'TSLB', Nfvar, ffilens, fncids)
+               CALL multisearch_var(debug, main, nfs, ncids, 'TSLB', Nfvar, ffilens, fncids)
                CALL get_equivmultiWRFtimes(Nfvar, fncids(1:Nfvar), oDs(t,:), maxtimediff, ifile, ncid,&
                  indate)
                inc = Index1DArrayI(fncids(1:Nfvar), Nfvar, ncid)
@@ -1747,7 +1879,7 @@ PROGRAM netcdf2wps
                landproj = Iwithin_csvStr(tskextrap, ',', 3)
                invnA = TRIM(Swithin_csvStr(tskextrap, ',', 2))
                IF (landproj == ip) THEN
-                 CALL multisearch_var(debug, nfiles, allncids, invnA, Nfvar, ffilens, fncids)
+                 CALL multisearch_var(debug, main, nfiles, allncids, invnA, Nfvar, ffilens, fncids)
                  CALL get_equivmultitimes(Nfvar, fncids(1:Nfvar), infconf%indtimen(ip),               &               
                    infconf%invtimen(ip), oDs(t,:), maxtimediff, inc, ncid, indate, debug)
                  IF (debug) PRINT *,"    Filling 'stl3' with extrapolated values from ts labelled '"  &
@@ -1767,7 +1899,7 @@ PROGRAM netcdf2wps
              count4d = (/ lonlen, latlen, 1, 1 /)
              PRINT *,'Soil temperature layer 4'
              IF (TRIM(infconf%invstl1n) == 'WRFstl') THEN
-               CALL multisearch_var(debug, nfs, ncids, 'TSLB', Nfvar, ffilens, fncids)
+               CALL multisearch_var(debug, main, nfs, ncids, 'TSLB', Nfvar, ffilens, fncids)
                CALL get_equivmultiWRFtimes(Nfvar, fncids(1:Nfvar), oDs(t,:), maxtimediff, ifile, ncid,&
                  indate)
                inc = Index1DArrayI(fncids(1:Nfvar), Nfvar, ncid)
@@ -1777,7 +1909,7 @@ PROGRAM netcdf2wps
                landproj = Iwithin_csvStr(tskextrap, ',', 3)
                invnA = TRIM(Swithin_csvStr(tskextrap, ',', 2))
                IF (landproj == ip) THEN
-                 CALL multisearch_var(debug, nfiles, allncids, invnA, Nfvar, ffilens, fncids)
+                 CALL multisearch_var(debug, main, nfiles, allncids, invnA, Nfvar, ffilens, fncids)
                  CALL get_equivmultitimes(Nfvar, fncids(1:Nfvar), infconf%indtimen(ip),               &               
                    infconf%invtimen(ip), oDs(t,:), maxtimediff, inc, ncid, indate, debug)
                  IF (debug) PRINT *,"    Filling 'stl4' with extrapolated values from ts labelled '"  &
@@ -1796,7 +1928,7 @@ PROGRAM netcdf2wps
            IF (infexec%computeswvl1) THEN
              PRINT *,'Volumetric soil water layer 1'
              IF (TRIM(infconf%invswvl1n) == 'WRFswvl') THEN
-               CALL multisearch_var(debug, nfs, ncids, 'SMOIS', Nfvar, ffilens, fncids)
+               CALL multisearch_var(debug, main, nfs, ncids, 'SMOIS', Nfvar, ffilens, fncids)
                CALL get_equivmultiWRFtimes(Nfvar, fncids(1:Nfvar), oDs(t,:), maxtimediff, ifile, ncid,&
                  indate)
                inc = Index1DArrayI(fncids(1:Nfvar), Nfvar, ncid)
@@ -1806,7 +1938,7 @@ PROGRAM netcdf2wps
                landproj = Iwithin_csvStr(mrsosextrap, ',', 3)
                invnA = TRIM(Swithin_csvStr(mrsosextrap, ',', 2))
                IF (landproj == ip) THEN
-                 CALL multisearch_var(debug, nfiles, allncids, invnA, Nfvar, ffilens, fncids)
+                 CALL multisearch_var(debug, main, nfiles, allncids, invnA, Nfvar, ffilens, fncids)
                  CALL get_equivmultitimes(Nfvar, fncids(1:Nfvar), infconf%indtimen(ip),               &
                    infconf%invtimen(ip), oDs(t,:), maxtimediff, inc, ncid, indate, debug)
                  IF (debug) PRINT *,"    Filling 'swvl1' with extrapolated values from mrsos " //     &
@@ -1834,7 +1966,7 @@ PROGRAM netcdf2wps
            IF (infexec%computeswvl2) THEN
              PRINT *,'Volumetric soil water layer 2'
              IF (TRIM(infconf%invswvl1n) == 'WRFswvl') THEN
-               CALL multisearch_var(debug, nfs, ncids, 'SMOIS', Nfvar, ffilens, fncids)
+               CALL multisearch_var(debug, main, nfs, ncids, 'SMOIS', Nfvar, ffilens, fncids)
                CALL get_equivmultiWRFtimes(Nfvar, fncids(1:Nfvar), oDs(t,:), maxtimediff, ifile, ncid,&
                  indate)
                inc = Index1DArrayI(fncids(1:Nfvar), Nfvar, ncid)
@@ -1844,7 +1976,7 @@ PROGRAM netcdf2wps
                landproj = Iwithin_csvStr(mrsosextrap, ',', 3)
                invnA = TRIM(Swithin_csvStr(mrsosextrap, ',', 2))
                IF (landproj == ip) THEN
-                 CALL multisearch_var(debug, nfiles, allncids, invnA, Nfvar, ffilens, fncids)
+                 CALL multisearch_var(debug, main, nfiles, allncids, invnA, Nfvar, ffilens, fncids)
                  CALL get_equivmultitimes(Nfvar, fncids(1:Nfvar), infconf%indtimen(ip),               &
                    infconf%invtimen(ip), oDs(t,:), maxtimediff, inc, ncid, indate, debug)
                  IF (debug) PRINT *,"    Filling 'swvl2' with extrapolated values from mrsos " //     &
@@ -1862,7 +1994,7 @@ PROGRAM netcdf2wps
            IF (infexec%computeswvl3) THEN
              PRINT *,'Volumetric soil water layer 3'
              IF (TRIM(infconf%invswvl1n) == 'WRFswvl') THEN
-               CALL multisearch_var(debug, nfs, ncids, 'SMOIS', Nfvar, ffilens, fncids)
+               CALL multisearch_var(debug, main, nfs, ncids, 'SMOIS', Nfvar, ffilens, fncids)
                CALL get_equivmultiWRFtimes(Nfvar, fncids(1:Nfvar), oDs(t,:), maxtimediff, ifile, ncid,&
                  indate)
                inc = Index1DArrayI(fncids(1:Nfvar), Nfvar, ncid)
@@ -1872,7 +2004,7 @@ PROGRAM netcdf2wps
                landproj = Iwithin_csvStr(mrsosextrap, ',', 3)
                invnA = TRIM(Swithin_csvStr(mrsosextrap, ',', 2))
                IF (landproj == ip) THEN
-                 CALL multisearch_var(debug, nfiles, allncids, invnA, Nfvar, ffilens, fncids)
+                 CALL multisearch_var(debug, main, nfiles, allncids, invnA, Nfvar, ffilens, fncids)
                  CALL get_equivmultitimes(Nfvar, fncids(1:Nfvar), infconf%indtimen(ip),               &
                    infconf%invtimen(ip), oDs(t,:), maxtimediff, inc, ncid, indate, debug)
                  IF (debug) PRINT *,"    Filling 'swvl3' with extrapolated values from mrsos " //     &
@@ -1890,7 +2022,7 @@ PROGRAM netcdf2wps
            IF (infexec%computeswvl4) THEN
              PRINT *,'Volumetric soil water layer 4'
              IF (TRIM(infconf%invswvl1n) == 'WRFswvl') THEN
-               CALL multisearch_var(debug, nfs, ncids, 'SMOIS', Nfvar, ffilens, fncids)
+               CALL multisearch_var(debug, main, nfs, ncids, 'SMOIS', Nfvar, ffilens, fncids)
                CALL get_equivmultiWRFtimes(Nfvar, fncids(1:Nfvar), oDs(t,:), maxtimediff, ifile, ncid,&
                  indate)
                inc = Index1DArrayI(fncids(1:Nfvar), Nfvar, ncid)
@@ -1900,7 +2032,7 @@ PROGRAM netcdf2wps
                landproj = Iwithin_csvStr(mrsosextrap, ',', 3)
                invnA = TRIM(Swithin_csvStr(mrsosextrap, ',', 2))
                IF (landproj == ip) THEN
-                 CALL multisearch_var(debug, nfiles, allncids, invnA, Nfvar, ffilens, fncids)
+                 CALL multisearch_var(debug, main, nfiles, allncids, invnA, Nfvar, ffilens, fncids)
                  CALL get_equivmultitimes(Nfvar, fncids(1:Nfvar), infconf%indtimen(ip),               &
                    infconf%invtimen(ip), oDs(t,:), maxtimediff, inc, ncid, indate, debug)
                  IF (debug) PRINT *,"    Filling 'swvl4' with extrapolated values from mrsos " //     &
@@ -1944,6 +2076,14 @@ PROGRAM netcdf2wps
                CALL var3D_qv_tda_pres(lonlen, latlen, 1, tds, ps, qvs)
              END IF
            END IF
+           
+           IF (.NOT.infexec%computepsl .AND. infexec%computeorog .AND. infexec%computeps .AND.        &
+             ALLOCATED(qvs)) THEN
+             PRINT *,'Hydrostatic extrapolation of sea-level pressure (psl) using orog, ts, qvs and ps'
+             PRINT *,'     psl = ps * exp(g*orog/(Rd*tvs))'
+             var2Db = ts(:,:,1) * (1. + 0.608 * qvs(:,:,1))
+             psl(:,:,1) = ps(:,:,1) * EXP(grav*orog(:,:,1)/(Rd*var2Db))
+           END IF
 
            !!!!!!!!!!!!!!!!!!!!!!!!!! Printing some examples
            IF (t == ltpt) THEN
@@ -1961,6 +2101,12 @@ PROGRAM netcdf2wps
                    mask=mamask1D)
                  PRINT *, '    mean:', SUM(sst_mask, mask=mamask1D)/(COUNT(mamask1D))
                END IF
+               IF (infexec%computeorog) THEN
+                 mamask2D = orog /= metfillvalue
+                 PRINT *, '    orog =', orog(itpt,jtpt,1)
+                 PRINT *, '    min:', MINVAL(orog, mask=mamask2D), ' max:', MAXVAL(orog, mask=mamask2D)
+                 PRINT *, '    mean:', SUM(orog, mask=mamask2D)/(COUNT(mamask2D))
+               END IF
                IF (infexec%computehurs .OR. ALLOCATED(hurs)) THEN
                  mamask2D = hurs /= metfillvalue
                  PRINT *, '    hurs =', hurs(itpt,jtpt,1)
@@ -2021,7 +2167,7 @@ PROGRAM netcdf2wps
                  PRINT *, '    min:', MINVAL(ps, mask=mamask2D), ' max:', MAXVAL(ps, mask=mamask2D)
                  PRINT *, '    mean:', SUM(ps, mask=mamask2D)/(COUNT(mamask2D))
                END IF
-               IF (infexec%computepsl) THEN
+               IF (infexec%computepsl .OR. ALLOCATED(psl)) THEN
                  mamask2D = psl /= metfillvalue
                  PRINT *, '    psl =', psl(itpt,jtpt,1)
                  PRINT *, '    min:', MINVAL(psl, mask=mamask2D), ' max:', MAXVAL(psl, mask=mamask2D)
@@ -2089,6 +2235,7 @@ PROGRAM netcdf2wps
                END IF
              ELSE
                IF (infexec%computemask) PRINT *, 'sst_mask =', sst_mask(itpt,jtpt)
+               IF (infexec%computeorog) PRINT *, 'orog =', orog(itpt,jtpt,1)
                IF (infexec%computehurs .OR. ALLOCATED(hurs)) PRINT *, 'hurs =', hurs(itpt,jtpt,1)
                IF (infexec%computehuss) PRINT *, 'huss =', huss(itpt,jtpt,1)
                IF (infexec%computeqvs .OR. ALLOCATED(qvs)) PRINT *, 'qvs =', qvs(itpt,jtpt,1)
@@ -2099,7 +2246,7 @@ PROGRAM netcdf2wps
                IF (infexec%computets) PRINT *, ' ts =', ts(itpt,jtpt,1)
                IF (infexec%computesst) PRINT *, 'sst =', sst(itpt,jtpt,1)
                IF (infexec%computeps) PRINT *, 'ps =', ps(itpt,jtpt,1)
-               IF (infexec%computepsl) PRINT *, 'psl =', psl(itpt,jtpt,1)
+               IF (infexec%computepsl .OR. ALLOCATED(psl)) PRINT *, 'psl =', psl(itpt,jtpt,1)
                IF (infexec%computesnd) PRINT *, 'snd =', snd(itpt,jtpt,1)
                IF (infexec%computeci) PRINT *, 'ci =', ci(itpt,jtpt,1)
                IF (infexec%computestl1) PRINT *, 'stl1 =', stl1(itpt,jtpt,1)
@@ -2121,12 +2268,17 @@ PROGRAM netcdf2wps
            
            ! First get the variables without p-level extrapolation
            IF (infexec%computeua) THEN 
+             PRINT *,'westward wind speed'
              IF (TRIM(infconf%inptua) == 'plev') THEN
-               PRINT *,'westward wind speed'
                CALL get_3Dfield(debug, nfs, ncids, infconf%invuan, 'ua', infconf%indtimen(ip),        &
                  infconf%invtimen(ip), oDs(t,:),  maxtimediff, lonlen, latlen, levellen, ua_pl)
              ELSE IF (TRIM(infconf%inptua) == 'modlev') THEN
-               !CONTINUE
+               PRINT *,'  from model-levels'
+               IF (ALLOCATED(ua_ml)) DEALLOCATE(ua_ml)
+               ALLOCATE(ua_ml(lonlen,latlen,modlevellen,1))
+               CALL get_3Dfield(debug, nfs, ncids, infconf%invuan, 'ua',                              &
+                 infconf%indtimen(ip), infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen,   &
+                 modlevellen, ua_ml)
              ELSE
                msg = "Vertical level type for 'ua' as '" // TRIM(infconf%inptua) // "' not ready !!"
                CALL stoprunAvail(msg, main, Navailinpt, availinpt)
@@ -2134,25 +2286,85 @@ PROGRAM netcdf2wps
            END IF
 
            IF (infexec%computeva) THEN 
+             PRINT *,'northward wind speed'
              IF (TRIM(infconf%inptva) == 'plev') THEN
-               PRINT *,'northward wind speed'
                CALL get_3Dfield(debug, nfs, ncids, infconf%invvan, 'va', infconf%indtimen(ip),        &
                  infconf%invtimen(ip), oDs(t,:),  maxtimediff, lonlen, latlen, levellen, va_pl)
              ELSE IF (TRIM(infconf%inptva) == 'modlev') THEN
-               !CONTINUE
+               PRINT *,'  from model-levels'             
+               IF (ALLOCATED(va_ml)) DEALLOCATE(va_ml)
+               ALLOCATE(va_ml(lonlen,latlen,modlevellen,1))
+               CALL get_3Dfield(debug, nfs, ncids, infconf%invvan, 'va',                              &
+                 infconf%indtimen(ip), infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen,   &
+                 modlevellen, va_ml)
              ELSE
                msg = "Vertical level type for 'va' as '" // TRIM(infconf%inptva) // "' not ready !!"
                CALL stoprunAvail(msg, main, Navailinpt, availinpt)
              END IF
            END IF
 
+           IF (infexec%computezg) THEN 
+             PRINT *,'Geopotential'
+             IF (TRIM(infconf%inptzg) == 'plev') THEN
+               CALL get_3Dfield(debug, nfs, ncids, infconf%invzgn, 'zg', infconf%indtimen(ip),        &
+                 infconf%invtimen(ip), oDs(t,:),  maxtimediff, lonlen, latlen, levellen, zg_pl)
+             ELSE IF (TRIM(infconf%inptzg) == 'modlev') THEN
+               PRINT *,'  from model-levels'             
+               IF (ALLOCATED(zg_ml)) DEALLOCATE(zg_ml)
+               ALLOCATE(zg_ml(lonlen,latlen,modlevellen,1))
+               zg_ml = Rfillvalue
+               IF (TRIM(infconf%invzgn) == 'WRFgeop') THEN
+                 PRINT *, '    Computing geopotential from WRF output PH+PHB'
+                 CALL multisearch_var(debug, main, nfs, ncids, 'PH', Nfvar, ffilens, fncids)
+                 CALL get_equivmultiWRFtimes(Nfvar, fncids(1:Nfvar), oDs(t,:), maxtimediff, ifile,    &
+                   ncid, indate)
+                 IF (ALLOCATED(geop3D)) DEALLOCATE(geop3D)
+                 ALLOCATE(geop3D(lonlen,latlen,modlevellen,alldimts(ifile)))
+                 CALL compute_WRFgeop(ncid, lonlen, latlen, modlevellen, alldimts(ifile), geop3D)
+                 inc = Index1DArrayI(fncids(1:Nfvar), Nfvar, ncid)
+                 zg_ml(:,:,:,1) = geop3D(:,:,:,indate)
+                 IF (debug) THEN
+                   PRINT *,'    zg_ml values min:', MINVAL(zg_ml(:,:,:,1)), ' max:',                  &
+                     MAXVAL(zg_ml(:,:,:,1))
+                 END IF
+               ELSE
+                 CALL get_3Dfield(debug, nfs, ncids, infconf%invzgn, 'zg',                            &
+                   infconf%indtimen(ip), infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, &
+                   modlevellen, zg_ml)               
+               END IF
+             ELSE
+               msg = "Vertical level type for 'zg' as '" // TRIM(infconf%inptzg) // "' not ready !!"
+               CALL stoprunAvail(msg, main, Navailinpt, availinpt)
+             END IF
+           END IF
+
            IF (infexec%computeta) THEN 
+             PRINT *,'temperature'
              IF (TRIM(infconf%inptta) == 'plev') THEN
-               PRINT *,'temperature'
                CALL get_3Dfield(debug, nfs, ncids, infconf%invtan, 'ta', infconf%indtimen(ip),        &
                  infconf%invtimen(ip), oDs(t,:),  maxtimediff, lonlen, latlen, levellen, ta_pl)
              ELSE IF (TRIM(infconf%inptta) == 'modlev') THEN
-               !CONTINUE
+               PRINT *,'  from model-levels'             
+               IF (ALLOCATED(ta_ml)) DEALLOCATE(ta_ml)
+               ALLOCATE(ta_ml(lonlen,latlen,modlevellen,1))
+               ta_ml = Rfillvalue
+               IF (TRIM(infconf%invtan) == 'WRFta') THEN
+                 PRINT *,'  computing ta using WRFta'
+                 IF (ALLOCATED(var4dA)) DEALLOCATE(var4dA)
+                 ALLOCATE(var4dA(lonlen, latlen, modlevellen, alldimts(ifile)))
+                 CALL multisearch_var(debug, main, nfs, ncids, 'P', Nfvar, ffilens, fncids)
+                 CALL get_equivmultiWRFtimes(Nfvar, fncids(1:Nfvar), oDs(t,:), maxtimediff, ifile,    &
+                   ncid, indate)
+                 CALL compute_WRFta(ncid, lonlen, latlen, modlevellen, alldimts(ifile), var4dA)
+                 ta_ml(:,:,:,1) = var4dA(:,:,:,indate)
+                 IF (debug) THEN
+                   PRINT *,'    ta_ml values min:', MINVAL(ta_ml(:,:,:,1)), ' max:',                  &
+                     MAXVAL(ta_ml(:,:,:,1))
+                 END IF
+               ELSE
+                 CALL get_3Dfield(debug, nfs, ncids, infconf%invtan, 'ta', infconf%indtimen(ip),      &
+                   infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, ta_ml)
+               END IF
              ELSE
                msg = "Vertical level type for 'ta' as '" // TRIM(infconf%inptta) // "' not ready !!"
                CALL stoprunAvail(msg, main, Navailinpt, availinpt)
@@ -2162,10 +2374,14 @@ PROGRAM netcdf2wps
            IF (infexec%computetda) THEN 
              IF (TRIM(infconf%inpttda) == 'plev') THEN
                PRINT *,'dew-point temperature'
-               CALL get_3Dfield(debug, nfs, ncids, infconf%invtdan, 'tda', infconf%indtimen(ip),        &
+               CALL get_3Dfield(debug, nfs, ncids, infconf%invtdan, 'tda', infconf%indtimen(ip),      &
                  infconf%invtimen(ip), oDs(t,:),  maxtimediff, lonlen, latlen, levellen, tda_pl)
              ELSE IF (TRIM(infconf%inpttda) == 'modlev') THEN
-               !CONTINUE
+               IF (ALLOCATED(tda_ml)) DEALLOCATE(tda_ml)
+               ALLOCATE(tda_ml(lonlen,latlen,modlevellen,1))
+               CALL get_3Dfield(debug, nfs, ncids, infconf%invtdan, 'tda',                            &
+                 infconf%indtimen(ip), infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen,   &
+                 modlevellen, tda_ml)
              ELSE
                msg = "Vertical level type for 'tda' as '" // TRIM(infconf%inpttda) // "' not ready !!"
                CALL stoprunAvail(msg, main, Navailinpt, availinpt)
@@ -2175,10 +2391,14 @@ PROGRAM netcdf2wps
            IF (infexec%computehur) THEN 
              IF (TRIM(infconf%inpthur) == 'plev') THEN
                PRINT *,'relative humidity'
-               CALL get_3Dfield(debug, nfs, ncids, infconf%invhurn, 'hur', infconf%indtimen(ip),        &
+               CALL get_3Dfield(debug, nfs, ncids, infconf%invhurn, 'hur', infconf%indtimen(ip),      &
                  infconf%invtimen(ip), oDs(t,:),  maxtimediff, lonlen, latlen, levellen, hur_pl)
              ELSE IF (TRIM(infconf%inpthur) == 'modlev') THEN
-               !CONTINUE
+               IF (ALLOCATED(hur_ml)) DEALLOCATE(hur_ml)
+               ALLOCATE(hur_ml(lonlen,latlen,modlevellen,1))
+               CALL get_3Dfield(debug, nfs, ncids, infconf%invhurn, 'hur',                            &
+                 infconf%indtimen(ip), infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen,   &
+                 modlevellen, hur_ml)
              ELSE
                msg = "Vertical level type for 'hur' as '" // TRIM(infconf%inpthur) // "' not ready !!"
                CALL stoprunAvail(msg, main, Navailinpt, availinpt)
@@ -2188,13 +2408,17 @@ PROGRAM netcdf2wps
            IF (infexec%computehus) THEN 
              IF (TRIM(infconf%inpthus) == 'plev') THEN
                PRINT *,'specific humidity'
-               CALL get_3Dfield(debug, nfs, ncids, infconf%invhusn, 'hus', infconf%indtimen(ip),        &
+               CALL get_3Dfield(debug, nfs, ncids, infconf%invhusn, 'hus', infconf%indtimen(ip),      &
                  infconf%invtimen(ip), oDs(t,:),  maxtimediff, lonlen, latlen, levellen, hus_pl)
                IF (.NOT.infexec%computeqv) THEN 
                  qv_pl = hus_pl / (1. - hus_pl)
                END IF
              ELSE IF (TRIM(infconf%inpthus) == 'modlev') THEN
-               !CONTINUE
+               IF (ALLOCATED(hus_ml)) DEALLOCATE(hus_ml)
+               ALLOCATE(hus_ml(lonlen,latlen,modlevellen,1))
+               CALL get_3Dfield(debug, nfs, ncids, infconf%invhusn, 'hus',                            &
+                 infconf%indtimen(ip), infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen,   &
+                 modlevellen, hus_ml)
              ELSE
                msg = "Vertical level type for 'hus' as '" // TRIM(infconf%inpthus) // "' not ready !!"
                CALL stoprunAvail(msg, main, Navailinpt, availinpt)
@@ -2207,28 +2431,22 @@ PROGRAM netcdf2wps
                CALL get_3Dfield(debug, nfs, ncids, infconf%invqvn, 'qv', infconf%indtimen(ip),        &
                  infconf%invtimen(ip), oDs(t,:),  maxtimediff, lonlen, latlen, levellen, qv_pl)
              ELSE IF (TRIM(infconf%inptqv) == 'modlev') THEN
-               !CONTINUE
+               IF (ALLOCATED(qv_ml)) DEALLOCATE(qv_ml)
+               ALLOCATE(qv_ml(lonlen,latlen,modlevellen,1))
+               CALL get_3Dfield(debug, nfs, ncids, infconf%invqvn, 'qv',                              &
+                 infconf%indtimen(ip), infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen,   &
+                 modlevellen, qv_ml)
              ELSE
                msg = "Vertical level type for 'qv' as '" // TRIM(infconf%inptqv) // "' not ready !!"
                CALL stoprunAvail(msg, main, Navailinpt, availinpt)
              END IF
            END IF
 
-           IF (infexec%computezg) THEN 
-             IF (TRIM(infconf%inptzg) == 'plev') THEN
-               PRINT *,'geopotential'
-               CALL get_3Dfield(debug, nfs, ncids, infconf%invzgn, 'zg', infconf%indtimen(ip),        &
-                 infconf%invtimen(ip), oDs(t,:),  maxtimediff, lonlen, latlen, levellen, zg_pl)
-             ELSE IF (TRIM(infconf%inptzg) == 'modlev') THEN
-               !CONTINUE
-             ELSE
-               msg = "Vertical level type for 'zg' as '" // TRIM(infconf%inptzg) // "' not ready !!"
-               CALL stoprunAvail(msg, main, Navailinpt, availinpt)
-             END IF
-           END IF
-
+           ! Use of model-level values
+           !! Direct interpolations
            ! Getting pressure values
            IF (infexec%computemodlev) THEN
+             PRINT *,'model-level pressure'
              IF (ALLOCATED(p_ml)) DEALLOCATE(p_ml)
              ALLOCATE(p_ml(lonlen, latlen, modlevellen, 1))
              ! Different options
@@ -2237,6 +2455,19 @@ PROGRAM netcdf2wps
                ALLOCATE(modpres(lonlen, latlen, modlevellen, 1))
                CALL compute_hybridp(lonlen, latlen, modlevellen, infconf%invmodlevn(ip), nfs, ncids,  &
                  infconf%indtimen(ip), infconf%invtimen(ip), oDs(t,:), maxtimediff, p_ml)
+             ELSE IF (infconf%invmodlevn(ip)(1:7) == 'WRFpres') THEN
+               PRINT *, '  Computing pressure from WRF output P+PB'
+               CALL multisearch_var(debug, main, nfs, ncids, 'P', Nfvar, ffilens, fncids)
+               CALL get_equivmultiWRFtimes(Nfvar, fncids(1:Nfvar), oDs(t,:), maxtimediff, ifile, ncid,&
+                 indate)
+               IF (ALLOCATED(var4dA)) DEALLOCATE(var4dA)
+               ALLOCATE(var4dA(lonlen,latlen,modlevellen,alldimts(ifile)))
+               CALL compute_WRFpres(ncid, lonlen, latlen, modlevellen, alldimts(ifile), var4dA)
+               inc = Index1DArrayI(fncids(1:Nfvar), Nfvar, ncid)
+               p_ml(:,:,:,1) = var4dA(:,:,:,indate)
+               IF (debug) THEN
+                 PRINT *,'    p_ml values min:', MINVAL(p_ml(:,:,:,1)), ' max:', MAXVAL(p_ml(:,:,:,1))
+               END IF
              ELSE
                CALL get_3Dfield(debug, nfs, ncids, infconf%invplevn(ip), 'pres',                      &
                  infconf%indtimen(ip), infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen,   &
@@ -2245,21 +2476,45 @@ PROGRAM netcdf2wps
            END IF
 
            ! p-level Interpolating
+           IF (infexec%computezg) THEN 
+             IF (TRIM(infconf%inptzg) == 'modlev' .AND. TRIM(infconf%invzgn) /= 'None') THEN
+               IF (ALL(zg_ml /= Rfillvalue) .AND. ALL(ta_ml /= Rfillvalue) .AND.                      &
+                 ALL(qv_ml /= Rfillvalue)) THEN
+                 PRINT *,'Geopotential interpolated from model levels and p-level inputs using ta & qv'
+                 CALL pld(lonlen, latlen, modlevellen, z=zg_ml, p=p_ml, t=ta_ml, qv=qv_ml,            &
+                   extrap_below_grnd=.TRUE., missing=metfillvalue, num_press_levels=levellen,         &
+                   press_levels=level, ght_pl=zg_pl)
+                 IF (debug) THEN
+                   PRINT *,'    zg_pl values min:', MINVAL(zg_pl(:,:,:,1)), ' max:',                  &
+                     MAXVAL(zg_pl(:,:,:,1))
+                   IF (ANY(zg_pl < metfillvalue*0.9) .OR. ANY(ISNAN(zg_pl))) THEN
+                     Ival = COUNT(zg_pl < metfillvalue*0.9) + COUNT(ISNAN(zg_pl))
+                     DO k=1, levellen
+                       PRINT *, '  ', k, ' level pressure:', level(k), ' _______'
+                       DO i=1, lonlen
+                         PRINT *,(zg_pl(i,j,k,1),j=1,latlen)
+                       END DO
+                     END DO
+                     msg = TRIM(ItoS(Ival)) // " missing values found in p-level interpolated " //    &
+                       "geopotential field !!"
+                     CALL StopRun(msg, main)
+                   END IF
+                 END IF
+               END IF
+             END IF
+           END IF
+
            IF (infexec%computeua) THEN
              IF (TRIM(infconf%inptua) == 'modlev') THEN
-               PRINT *,'V wind Earth-Rotated interpolated from model levels'
+               PRINT *,'U wind Earth-Rotated interpolated from model levels'
                ! Model-level variable
-               IF (ALLOCATED(ua_ml)) DEALLOCATE(ua_ml)
-               ALLOCATE(ua_ml(lonlen, latlen, modlevellen, 1))
-               CALL get_3Dfield(debug, nfs, ncids, infconf%invuan, 'ua', infconf%indtimen(ip),        &
-                 infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, ua_ml)
-               CALL pld(lonlen, latlen, modlevellen, u=ua_ml, p=p_ml, extrap_below_grnd=.TRUE.,       &
+               CALL pld(lonlen, latlen, modlevellen, u=ua_ml,p=p_ml,t=ta_ml, extrap_below_grnd=.TRUE.,&
                  missing=metfillvalue, num_press_levels=levellen, press_levels=level, u_pl=ua_pl)
                ! There is p_top?
                IF (computeptop) THEN
                  IF (ALLOCATED(uaptopmod)) DEALLOCATE(uaptopmod)
                  ALLOCATE(uaptopmod(lonlen, latlen, 1, 1))
-                 CALL pld(lonlen, latlen, modlevellen, u=ua_ml, p=p_ml, extrap_below_grnd=.TRUE.,     &
+                 CALL pld(lonlen, latlen, modlevellen,u=ua_ml,p=p_ml,t=ta_ml,extrap_below_grnd=.TRUE.,&
                    missing=metfillvalue, num_press_levels=1, press_levels=(/p_top*1./), u_pl=uaptopmod)           
                END IF
              END IF
@@ -2269,17 +2524,13 @@ PROGRAM netcdf2wps
              IF (TRIM(infconf%inptva) == 'modlev') THEN
                PRINT *,'V wind Earth-Rotated interpolated from model levels'
                ! Model-level variable
-               IF (ALLOCATED(va_ml)) DEALLOCATE(va_ml)
-               ALLOCATE(va_ml(lonlen, latlen, modlevellen, 1))
-               CALL get_3Dfield(debug, nfs, ncids, infconf%invvan, 'va', infconf%indtimen(ip),        &
-                 infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, va_ml)
-               CALL pld(lonlen, latlen, modlevellen, u=va_ml, p=p_ml, extrap_below_grnd=.TRUE.,       &
+               CALL pld(lonlen, latlen, modlevellen, u=va_ml,p=p_ml,t=ta_ml,extrap_below_grnd=.TRUE., &
                  missing=metfillvalue, num_press_levels=levellen, press_levels=level, u_pl=va_pl)
                ! There is p_top?
                IF (computeptop) THEN
                  IF (ALLOCATED(vaptopmod)) DEALLOCATE(vaptopmod)
                  ALLOCATE(vaptopmod(lonlen, latlen, 1, 1))
-                 CALL pld(lonlen, latlen, modlevellen, v=va_ml, p=p_ml, extrap_below_grnd=.TRUE.,     &
+                 CALL pld(lonlen, latlen, modlevellen,v=va_ml,p=p_ml,t=ta_ml,extrap_below_grnd=.TRUE.,&
                    missing=metfillvalue, num_press_levels=1, press_levels=(/p_top*1./), v_pl=vaptopmod)
                END IF
              END IF
@@ -2288,23 +2539,27 @@ PROGRAM netcdf2wps
            ! p-level Interpolating by already accesible p-level variables
            IF (infexec%computeta) THEN
              IF (TRIM(infconf%inptta) == 'modlev') THEN
-               ! Model-level variable
-               IF (ALLOCATED(ta_ml)) DEALLOCATE(ta_ml)
-               ALLOCATE(ta_ml(lonlen, latlen, modlevellen, 1))
-               CALL get_3Dfield(debug, nfs, ncids, infconf%invtan, 'ta', infconf%indtimen(ip),        &
-                 infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, ta_ml)
+               PRINT *,'T interpolated from model levels'
                ! To p-level interpolate temperature is required also z_pl
-               IF (ALL(zg_pl /= 0.)) THEN
-                 PRINT *,'Temperature interpolated from model levels and p-level inputs'
-                 CALL pld(lonlen, latlen, modlevellen, t=ta_ml, p=p_ml, ght_pl=zg_pl,                 &
+               IF (ALL(zg_ml /= Rfillvalue)) THEN
+                 PRINT *,'Temperature interpolated from model levels and model-level inputs'
+                 CALL pld(lonlen, latlen, modlevellen, t=ta_ml, p=p_ml, z=zg_ml,                      &
                    extrap_below_grnd=.TRUE., missing=metfillvalue, num_press_levels=levellen,         &
                    press_levels=level, t_pl=ta_pl)
+               ELSE
+                 msg = 'I do not kow how to interpolate ta from model-levels without geopotential. '//&
+                   'Neither I have it at pressure-levels, nor at model-levels'
+                 CALL StopRun(msg, main)
+               END IF
+               IF (debug) THEN
+                 PRINT *,'    ta_pl values min:', MINVAL(ta_pl(:,:,:,1)), ' max:',                    &
+                   MAXVAL(ta_pl(:,:,:,1))
                END IF
                ! There is p_top?
                IF (computeptop) THEN
                  IF (ALLOCATED(taptopmod)) DEALLOCATE(taptopmod)
                  ALLOCATE(taptopmod(lonlen, latlen, 1, 1))
-                 CALL pld(lonlen, latlen, modlevellen, p=p_ml, t=ta_ml, extrap_below_grnd=.TRUE.,     &
+                 CALL pld(lonlen, latlen, modlevellen,p=p_ml,t=ta_ml,z=zg_ml,extrap_below_grnd=.TRUE.,&
                    missing=metfillvalue, num_press_levels=1, press_levels=(/p_top*1./), t_pl=taptopmod)
                END IF
              ENDIF
@@ -2313,10 +2568,7 @@ PROGRAM netcdf2wps
            IF (infexec%computehur) THEN 
              IF (TRIM(infconf%inpthur) == 'modlev') THEN
                ! Model-level variable
-               IF (ALLOCATED(hur_ml)) DEALLOCATE(hur_ml)
-               ALLOCATE(hur_ml(lonlen, latlen, modlevellen, 1))
-               CALL get_3Dfield(debug, nfs, ncids, infconf%invhurn, 'hur', infconf%indtimen(ip),      &
-                 infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, hur_ml)
+               PRINT *,'Relative humidity from model levels'
                ! To p-level interpolate relatrive humidity is required also qv, t or t_pl
                IF (ALL(ta_pl /= 0.)) THEN
                  PRINT *,'Relative humidity interpolated from model levels and p-level inputs'
@@ -2333,19 +2585,22 @@ PROGRAM netcdf2wps
              END IF
            END IF
 
-           IF (infexec%computezg) THEN 
+           IF (infexec%computezg .AND. ALL(zg_pl == 0.)) THEN 
              IF (TRIM(infconf%inptzg) == 'modlev') THEN
+               PRINT *,'Geopotential at model levels interpolated using, temperature and mixing ratio'
                ! Model-level variable
-               IF (ALLOCATED(zg_ml)) DEALLOCATE(zg_ml)
-               ALLOCATE(zg_ml(lonlen, latlen, modlevellen, 1))
-               CALL get_3Dfield(debug, nfs, ncids, infconf%invzgn, 'zg', infconf%indtimen(ip),        &
-                 infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, zg_ml)
                ! To p-level extrapolate zg we require t, qv or t_pl, qv_pl
                IF (ALL(ta_pl /= 0.) .AND. ALL(qv_pl /= 0.)) THEN
                  PRINT *,'Geopotential Height interpolated from model levels and p-level inputs'
                  CALL pld(lonlen, latlen, modlevellen, tda=tda_ml, p=p_ml, t_pl=ta_pl, qv_pl=qv_pl,   &
                    extrap_below_grnd=.TRUE., missing=metfillvalue, num_press_levels=levellen,         &
                    press_levels=level, ght_pl=zg_pl)
+               ! To p-level extrapolate zg we require t, qv
+               ELSE IF (ALL(ta_ml /= Rfillvalue) .AND. ALL(qv_ml /= Rfillvalue)) THEN
+                 PRINT *,'Geopotential Height interpolated from model levels and mod-level inputs'
+                 CALL pld(lonlen, latlen, modlevellen, t=ta_ml, p=p_ml, qv=qv_pl,                     &
+                   extrap_below_grnd=.TRUE., missing=metfillvalue, num_press_levels=levellen,         &
+                   press_levels=level, ght_pl=zg_pl)
                END IF
                ! There is p_top?
                IF (computeptop) THEN
@@ -2357,19 +2612,24 @@ PROGRAM netcdf2wps
              END IF
            END IF
 
-           IF (infexec%computeqv) THEN 
+           IF (infexec%computeqv .AND. ALL(qv_pl == 0.)) THEN 
              IF (TRIM(infconf%inptqv) == 'modlev') THEN
+               PRINT *,'Mixing ratio at model levels interpolated using, relative humidity and ' //   &
+                 'temperature'             
                ! Model-level variable
-               IF (ALLOCATED(qv_ml)) DEALLOCATE(qv_ml)
-               ALLOCATE(qv_ml(lonlen, latlen, modlevellen, 1))
-               CALL get_3Dfield(debug, nfs, ncids, invqvn, 'qv', indtimen(ip), invtimen(ip),          &
-                 oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, qv_ml)
                ! To p-level interpolate qv we require hur_pl, ta_pl
-               IF (ALL(hur_pl /= 0.) .AND. ALL(ta_pl /= 0.)) THEN
-                 PRINT *,'Water vapor mixing ratio interpolated from model levels and p-level inputs'
+               IF (ALL(hur_pl /= 0.) .AND. ALL(ta_ml /= Rfillvalue) .AND. ALLOCATED(hur_pl)) THEN
+                 PRINT *,'Water vapor mixing ratio interpolated from model levels and p-level ' //    &
+                   ' inputs using hur_pl and ta_pl'
                  CALL pld(lonlen, latlen, modlevellen, qv=qv_ml, p=p_ml, rh_pl=hur_pl, t_pl=ta_pl,    &
                    extrap_below_grnd=.TRUE., missing=metfillvalue, num_press_levels=levellen,         &
                    press_levels=level, qv_pl=qv_pl)
+               ELSE IF (ALL(hur_pl == 0.) .AND. ALL(ta_ml /= Rfillvalue)) THEN
+                 PRINT *,'Water vapor mixing ratio interpolated from model levels and p-level ' //    &
+                   'inputs using ta_ml'
+                 CALL pld(lonlen, latlen, modlevellen, qv=qv_ml, p=p_ml, t=ta_ml,                     &
+                   extrap_below_grnd=.TRUE., missing=metfillvalue, num_press_levels=levellen,         &
+                   press_levels=level, qv_pl=qv_pl)
                END IF
                ! There is p_top?
                IF (computeptop) THEN
@@ -2381,14 +2641,14 @@ PROGRAM netcdf2wps
              END IF
            END IF
 
-           IF (infexec%computehus) THEN 
+           IF (infexec%computehus .AND. ALL(hus_pl == 0.)) THEN 
              IF (TRIM(infconf%inpthus) == 'modlev') THEN
+               PRINT *,'Mixing ratio at model levels interpolated using, specific humidity'             
                ! Model-level variable
-               IF (ALLOCATED(hus_ml)) DEALLOCATE(hus_ml)
-               ALLOCATE(hus_ml(lonlen, latlen, modlevellen, 1))
                IF (.NOT.ALLOCATED(qv_ml)) THEN
                  IF (ALLOCATED(qv_ml)) DEALLOCATE(qv_ml)
                  ALLOCATE(qv_ml(lonlen, latlen, modlevellen, 1))
+                 qv_ml = Rfillvalue
                END IF
                CALL get_3Dfield(debug, nfs, ncids, infconf%invqvn, 'qv', infconf%indtimen(ip),        &
                  infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, qv_ml)
@@ -2420,13 +2680,10 @@ PROGRAM netcdf2wps
              END IF
            END IF
 
-           IF (infexec%computetda) THEN 
+           IF (infexec%computetda .AND. ALL(tda_pl == 0.)) THEN 
              IF (TRIM(inpttda) == 'modlev') THEN
                ! Model-level variable
-               IF (ALLOCATED(tda_ml)) DEALLOCATE(tda_ml)
-               ALLOCATE(tda_ml(lonlen, latlen, modlevellen, 1))
-               CALL get_3Dfield(debug, nfs, ncids, invtdan, 'tda', indtimen(ip), invtimen(ip),        &
-                 oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, tda_ml)
+               PRINT *,'Dew point temperature at model levels'
                ! To p-level extrapolate tda we require qv_pl
                IF (ALL(qv_pl /= 0.)) THEN
                  PRINT *,'Dew point temperature interpolated from model levels and p-level inputs'
@@ -2448,51 +2705,69 @@ PROGRAM netcdf2wps
            END IF
 
            ! Interpolate using inputs at model levels
-           IF (infexec%computeta) THEN
+           IF (infexec%computeta .AND. ALL(ta_pl == 0.)) THEN
              IF (TRIM(infconf%inptta) == 'modlev') THEN
-               ! Model-level variable
-               IF (ALLOCATED(ta_ml)) DEALLOCATE(ta_ml)
-               ALLOCATE(ta_ml(lonlen, latlen, modlevellen, 1))
-               CALL get_3Dfield(debug, nfs, ncids, infconf%invtan, 'ta', infconf%indtimen(ip),        &
-                 infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, ta_ml)
+               PRINT *,'Temperature at model levels interpolated using geopotential and mixing ' //   &
+                 'ratio'
                ! To p-level interpolate temperature is required also z_pl or z, t, qv
-               IF (TRIM(infconf%inptzg) == 'modlev' .AND. TRIM(infconf%inptta) == 'modlev' .AND. &
-                 TRIM(infconf%inptqv) == 'modlev') THEN
+               IF (TRIM(infconf%inptzg) == 'modlev' .AND. TRIM(infconf%inptqv) == 'modlev') THEN
                  PRINT *,'Temperature interpolate from model-level values'
                  ! Model-level variable
-                 IF (ALLOCATED(zg_ml)) DEALLOCATE(zg_ml)
-                 ALLOCATE(zg_ml(lonlen, latlen, modlevellen, 1))
-                 CALL get_3Dfield(debug, nfs, ncids, infconf%invzgn, 'zg', infconf%indtimen(ip),      &
-                   infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, zg_ml)
-                 IF (ALLOCATED(ta_ml)) DEALLOCATE(ta_ml)
-                 ALLOCATE(ta_ml(lonlen, latlen, modlevellen, 1))
-                 CALL get_3Dfield(debug, nfs, ncids, infconf%invzgn, 'ta', infconf%indtimen(ip),      &
-                   infconf%invtimen(ip),  oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, ta_ml)
-                 IF (ALLOCATED(qv_ml)) DEALLOCATE(qv_ml)
-                 ALLOCATE(qv_ml(lonlen, latlen, modlevellen, 1))
-                 CALL get_3Dfield(debug, nfs, ncids, infconf%invqvn, 'qv', infconf%indtimen(ip),      &
-                   infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, qv_ml)
-                 CALL pld(lonlen, latlen, modlevellen, t=ta_ml, p=p_ml, z=zg_ml, qv=qv_ml,            &
-                   extrap_below_grnd=.TRUE., missing=metfillvalue, num_press_levels=levellen,         &
-                   press_levels=level, t_pl=ta_pl)
+                 IF (ALLOCATED(zg_ml) .AND. ALL(zg_ml /= Rfillvalue)) THEN
+                   ! geopotential at model levels already in system from previous steps
+                   IF (.NOT. ALLOCATED(qv_ml)) THEN
+                     CALL pld(lonlen, latlen, modlevellen, t=ta_ml, p=p_ml, z=zg_ml,                  &
+                       extrap_below_grnd=.TRUE., missing=metfillvalue, num_press_levels=levellen,     &
+                       press_levels=level, t_pl=ta_pl)
+                   ELSE
+                     CALL pld(lonlen, latlen, modlevellen, t=ta_ml, p=p_ml, z=zg_ml, qv=qv_ml,        &
+                       extrap_below_grnd=.TRUE., missing=metfillvalue, num_press_levels=levellen,     &
+                       press_levels=level, t_pl=ta_pl)                   
+                   END IF
+                 ELSE     
+                   IF (ALLOCATED(zg_ml)) DEALLOCATE(zg_ml)
+                   ALLOCATE(zg_ml(lonlen, latlen, modlevellen, 1))
+                   IF (TRIM(infconf%invzgn) == 'WRFgeop') THEN
+                     CALL multisearch_var(debug, main, nfs, ncids, 'PH', Nfvar, ffilens, fncids)
+                     CALL get_equivmultiWRFtimes(Nfvar, fncids(1:Nfvar), oDs(t,:), maxtimediff, ifile,&
+                       ncid, indate)
+                     IF (ALLOCATED(geop3D)) DEALLOCATE(geop3D)
+                     ALLOCATE(geop3D(lonlen,latlen,modlevellen,alldimts(ifile)))
+                     CALL compute_WRFgeop(ncid, lonlen, latlen, modlevellen, alldimts(ifile), geop3D)
+                       inc = Index1DArrayI(fncids(1:Nfvar), Nfvar, ncid)
+                       zg_ml(:,:,:,1) = geop3D(:,:,:,indate)
+                   ELSE
+                     CALL get_3Dfield(debug, nfs, ncids, infconf%invzgn, 'zg', infconf%indtimen(ip),  &
+                       infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, zg_ml)
+                   END IF
+                   IF (TRIM(infconf%invqvn) /= 'None') THEN
+                     ! We have also mixing ratio
+                     IF (.NOT.ALLOCATED(qv_ml)) THEN
+                       ALLOCATE(qv_ml(lonlen, latlen, modlevellen, 1))
+                       CALL get_3Dfield(debug, nfs, ncids, infconf%invqvn, 'qv', infconf%indtimen(ip),&
+                         infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, qv_ml)
+                     END IF
+                     CALL pld(lonlen, latlen, modlevellen, t=ta_ml, p=p_ml, z=zg_ml, qv=qv_ml,        &
+                       extrap_below_grnd=.TRUE., missing=metfillvalue, num_press_levels=levellen,     &
+                       press_levels=level, t_pl=ta_pl)
+                   ELSE
+                     CALL pld(lonlen, latlen, modlevellen, t=ta_ml, p=p_ml, z=zg_ml,                  &
+                       extrap_below_grnd=.TRUE., missing=metfillvalue, num_press_levels=levellen,     &
+                       press_levels=level, t_pl=ta_pl)                   
+                   END IF
+                 END IF
                END IF
              END IF
            END IF
 
-           IF (infexec%computezg) THEN 
+           IF (infexec%computezg .AND. ALL(zg_pl == 0.)) THEN 
              IF (TRIM(inptzg) == 'modlev') THEN
+               PRINT *,'Geopotential at model levels interpolated using temperature and mixing ' //   &
+                 'ratio'
                ! Model-level variable
-               IF (ALLOCATED(zg_ml)) DEALLOCATE(zg_ml)
-               ALLOCATE(zg_ml(lonlen, latlen, modlevellen, 1))
-               CALL get_3Dfield(debug, nfs, ncids, infconf%invzgn, 'zg', infconf%indtimen(ip),        &
-                 infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, zg_ml)
                ! To p-level interpolate zg we require t, qv or t_pl, qv_pl
                IF (TRIM(infconf%inptta) == 'modlev' .AND. TRIM(infconf%inptqv) == 'modlev') THEN
                  PRINT *,'Geopotential Height interpolate from model-level values'
-                 CALL get_3Dfield(debug, nfs, ncids, infconf%invtan, 'ta', infconf%indtimen(ip),      &
-                   infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, levellen, ta_pl)
-                 CALL get_3Dfield(debug, nfs, ncids, infconf%invqvn, 'qv', infconf%indtimen(ip),      &
-                   infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, levellen, qv_pl)
                  CALL pld(lonlen, latlen, modlevellen, tda=tda_ml, p=p_ml, t_pl=ta_pl, qv_pl=qv_pl,   &
                    extrap_below_grnd=.TRUE., missing=metfillvalue, num_press_levels=levellen,         &
                    press_levels=level, ght_pl=zg_pl)
@@ -2500,24 +2775,14 @@ PROGRAM netcdf2wps
              END IF
            END IF
 
-           IF (infexec%computehur) THEN 
+           IF (infexec%computehur .AND. ALL(hur_pl == 0.)) THEN 
              IF (TRIM(infconf%inpthur) == 'modlev') THEN
+               PRINT *,'Relative humidity at model levels interpolated using temperature and ' //     &
+                 'mixing ratio'
                ! Model-level variable
-               IF (ALLOCATED(hur_ml)) DEALLOCATE(hur_ml)
-               ALLOCATE(hur_ml(lonlen, latlen, modlevellen, 1))
-               CALL get_3Dfield(debug, nfs, ncids, infconf%invhurn, 'hur', infconf%indtimen(ip),      &
-                 infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, hur_ml)
                ! To p-level interpolate relatrive humidity is required also qv, t
                IF (TRIM(infconf%inptta) == 'modlev' .AND. TRIM(infconf%inptqv) == 'modlev') THEN
                  PRINT *,'Relative humidity interpolate from model-level values'
-                 IF (ALLOCATED(ta_ml)) DEALLOCATE(ta_ml)
-                 ALLOCATE(ta_ml(lonlen, latlen, modlevellen, 1))
-                 CALL get_3Dfield(debug, nfs, ncids, infconf%invtan, 'ta', infconf%indtimen(ip),      &
-                   infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, ta_ml)
-                 IF (ALLOCATED(qv_ml)) DEALLOCATE(qv_ml)
-                 ALLOCATE(qv_ml(lonlen, latlen, modlevellen, 1))
-                 CALL get_3Dfield(debug, nfs, ncids, infconf%invqvn, 'qv', infconf%indtimen(ip),      &
-                   infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, qv_ml)
                  CALL pld(lonlen, latlen, modlevellen, p=p_ml, t=ta_ml, qv=qv_ml,                     &
                    extrap_below_grnd=.TRUE., missing=metfillvalue, num_press_levels=levellen,         &
                    press_levels=level, rh_pl=hur_pl)
@@ -2525,13 +2790,11 @@ PROGRAM netcdf2wps
              END IF
            END IF
 
-           IF (infexec%computehus) THEN 
+           IF (infexec%computehus .AND. ALL(hus_pl == 0.) ) THEN 
              IF (TRIM(infconf%inpthus) == 'modlev') THEN
+               PRINT *,'Specific humidity at model levels interpolated using temperature and ' //     &
+                 'mixing ratio'
                ! Model-level variable
-               IF (ALLOCATED(hus_ml)) DEALLOCATE(hus_ml)
-               ALLOCATE(hus_ml(lonlen, latlen, modlevellen, 1))
-               CALL get_3Dfield(debug, nfs, ncids, infconf%invhusn, 'hus', infconf%indtimen(ip),      &
-                 infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, hus_ml)
                IF (.NOT.infexec%computeqv) THEN 
                  IF (ALLOCATED(qv_ml)) DEALLOCATE(qv_ml)
                  ALLOCATE(qv_ml(lonlen, latlen, modlevellen, 1))
@@ -2541,10 +2804,6 @@ PROGRAM netcdf2wps
                ! To p-level extrapolate qv we require ta
                IF (TRIM(inptta) == 'modlev') THEN
                  PRINT *,'Sepcific humidity interpolate from model-level variables'
-                 IF (ALLOCATED(ta_ml)) DEALLOCATE(ta_ml)
-                 ALLOCATE(ta_ml(lonlen, latlen, modlevellen, 1))
-                 CALL get_3Dfield(debug, nfs, ncids, infconf%invtan, 'ta', infconf%indtimen(ip),      &
-                   infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, ta_ml)
                  CALL pld(lonlen, latlen, modlevellen, qv=qv_ml, p=p_ml, t=ta_ml,                     &
                    extrap_below_grnd=.TRUE., missing=metfillvalue, num_press_levels=levellen,         &
                    press_levels=level, qv_pl=qv_pl)
@@ -2553,20 +2812,14 @@ PROGRAM netcdf2wps
              END IF
            END IF
 
-           IF (infexec%computeqv) THEN 
+           IF (infexec%computeqv .AND. ALL(qv_pl == 0)) THEN 
              IF (TRIM(infconf%inptqv) == 'modlev') THEN
                ! Model-level variable
-               IF (ALLOCATED(qv_ml)) DEALLOCATE(qv_ml)
-               ALLOCATE(qv_ml(lonlen, latlen, modlevellen, 1))
+               PRINT *,'Water vapor mixing ratio interpolate from model-level variables'
                CALL get_3Dfield(debug, nfs, ncids, infconf%invqvn, 'qv', infconf%indtimen(ip),        &
                  infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, qv_ml)
                ! To p-level extrapolate qv we require ta
                IF (TRIM(inptta) == 'modlev') THEN
-                 PRINT *,'Water vapor mixing ratio interpolate from model-level variables'
-                 IF (ALLOCATED(ta_ml)) DEALLOCATE(ta_ml)
-                 ALLOCATE(ta_ml(lonlen, latlen, modlevellen, 1))
-                 CALL get_3Dfield(debug, nfs, ncids, infconf%invtan, 'ta', infconf%indtimen(ip),      &
-                   infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, ta_ml)
                  CALL pld(lonlen, latlen, modlevellen, qv=qv_ml, p=p_ml, t=ta_ml,                     &
                    extrap_below_grnd=.TRUE., missing=metfillvalue, num_press_levels=levellen,         &
                    press_levels=level, qv_pl=qv_pl)
@@ -2574,19 +2827,12 @@ PROGRAM netcdf2wps
              END IF
            END IF
 
-           IF (infexec%computetda) THEN 
+           IF (infexec%computetda .AND. ALL(tda_pl == 0.)) THEN 
              IF (TRIM(infconf%inpttda) == 'modlev') THEN
                ! Model-level variable
-               IF (ALLOCATED(tda_ml)) DEALLOCATE(tda_ml)
-               ALLOCATE(tda_ml(lonlen, latlen, modlevellen, 1))
-               CALL get_3Dfield(debug, nfs, ncids, infconf%invtdan, 'tda', infconf%indtimen(ip),      &
-                 infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, tda_ml)
                ! Carefull it might happen that we do not have qv!!
                IF (infexec%computeqv .AND. TRIM(infconf%inptqv) == 'modlev') THEN
                  PRINT *,'Dew point temperature interpolate from model-level intput'
-                 ALLOCATE(qv_ml(lonlen, latlen, modlevellen, 1))
-                 CALL get_3Dfield(debug, nfs, ncids, infconf%invqvn, 'qv', infconf%indtimen(ip),      &
-                   infconf%invtimen(ip), oDs(t,:), maxtimediff, lonlen, latlen, modlevellen, qv_ml)
                  CALL pld(lonlen, latlen, modlevellen, tda=tda_ml, p=p_ml, qv=qv_ml,                  &
                    extrap_below_grnd=.TRUE., missing=metfillvalue, num_press_levels=levellen,         &
                    press_levels=level, td_pl=tda_pl)
@@ -2642,6 +2888,16 @@ PROGRAM netcdf2wps
                END IF
                hur_pl = hur_pl*1.
              END IF
+             IF (.NOT. infexec%computeqv) THEN
+               IF (infexec%computeta) THEN 
+                 PRINT *, TRIM(infmsg)
+                 PRINT *,"  retrieving 'qv' from 'p, ta, hur' ..."               
+                 IF (ALLOCATED(qv_pl)) DEALLOCATE(qv_pl)
+                 ALLOCATE(qv_pl(lonlen, latlen, levellen, 1))
+                 CALL var_qv_rh(lonlen, latlen, levellen, 1, ta_pl, level, hur_pl/100., qv_pl)
+                 infexec%computeqv = .TRUE.
+               END IF
+             END IF
            END IF
 
            IF (t == ltpt .AND. TRIM(indplevn(ip)) /= 'None') THEN
@@ -2762,6 +3018,23 @@ PROGRAM netcdf2wps
            ! This sould be more elegantly/cool/nicely done with a loop ...
            !! 
 
+           !Writing Orography
+           IF (infexec%computeorog) THEN
+             PRINT*,'  Writting Orography'
+             field='SOILHGT'
+             units='m'
+             desc='Orography above geoide'
+             xlvl=200100.
+             vecr1(:,:)=orog(:,:,1)
+             slab=vecr1(:,:)
+             CALL write_ungrib2DRval(idout, version(ip), hdate, xfcst(ip), map_source(ip), field,     &
+               units, desc, xlvl, nx, ny, iproj(ip))
+             CALL write_ungribprojinf(idout, iproj(ip), startloc(ip), startlat, startlon, NLg(ip),    &
+               ddy, ddx, centlon(ip), truelat1(ip), truelat2(ip), earth_radius(ip),                   &
+               is_wind_grid_rel(ip))
+             WRITE (idout) slab
+           END IF
+
            !Writing Relative Humidity at 2m
            IF (infexec%computehurs .OR. ALLOCATED(hurs)) THEN
              PRINT*,'  Writting Relative Humidity at 2m'
@@ -2882,7 +3155,7 @@ PROGRAM netcdf2wps
            END IF
 
            !Writing a variable Sea Level Pressure
-           IF (infexec%computepsl) THEN
+           IF (infexec%computepsl .OR. ALLOCATED(psl)) THEN
               PRINT*,'  Sea-level Pressure'
              field='PMSL'
              units='Pa'
@@ -3407,8 +3680,12 @@ PROGRAM netcdf2wps
              END IF
            END IF
 
+           ! Getting back to the forced variables
+           IF (TRIM(infconf%invqvn) == 'None' .AND. infexec%computeqv) infexec%computeqv = .FALSE.
+
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!
            CLOSE(idout)
+                      
          END DO time_steps
 
          DEALLOCATE(slab)
@@ -3439,11 +3716,13 @@ PROGRAM netcdf2wps
        IF (ALLOCATED(var3dB)) DEALLOCATE(var3dB)
        IF (ALLOCATED(var4dA)) DEALLOCATE(var4dA)
        IF (ALLOCATED(var4dB)) DEALLOCATE(var4dB)
+       IF (ALLOCATED(new2d1)) DEALLOCATE(new2d1)
        IF (ALLOCATED(new2d)) DEALLOCATE(new2d)
        IF (ALLOCATED(new3d)) DEALLOCATE(new3d)
        IF (ALLOCATED(new4d)) DEALLOCATE(new4d)
        IF (ALLOCATED(new5d)) DEALLOCATE(new5d)
   
+       IF (ALLOCATED(orog)) DEALLOCATE(orog)
        IF (ALLOCATED(sst_mask)) DEALLOCATE(sst_mask)
        IF (ALLOCATED(hurs)) DEALLOCATE(hurs)
        IF (ALLOCATED(huss)) DEALLOCATE(huss)
@@ -3478,11 +3757,36 @@ PROGRAM netcdf2wps
        IF (ALLOCATED(swvl2)) DEALLOCATE(swvl2)
        IF (ALLOCATED(swvl3)) DEALLOCATE(swvl3)
        IF (ALLOCATED(swvl4)) DEALLOCATE(swvl4)
+       IF (ALLOCATED(ua_ml)) DEALLOCATE(ua_ml)
+       IF (ALLOCATED(va_ml)) DEALLOCATE(va_ml)
+       IF (ALLOCATED(ta_ml)) DEALLOCATE(ta_ml)
+       IF (ALLOCATED(tda_ml)) DEALLOCATE(tda_ml)
+       IF (ALLOCATED(hur_ml)) DEALLOCATE(hur_ml)
+       IF (ALLOCATED(hus_ml)) DEALLOCATE(hus_ml)
+       IF (ALLOCATED(pb_ml)) DEALLOCATE(pb_ml)
+       IF (ALLOCATED(qv_ml)) DEALLOCATE(qv_ml)
+       IF (ALLOCATED(zg_ml)) DEALLOCATE(zg_ml)
+       IF (ALLOCATED(p_ml)) DEALLOCATE(p_ml)
+       IF (ALLOCATED(pb_ml)) DEALLOCATE(pb_ml)
+       IF (ALLOCATED(modpres)) DEALLOCATE(modpres)
+       IF (ALLOCATED(geop3D)) DEALLOCATE(geop3D)
 
        DEALLOCATE(lat, lat2, lon, time)
        DEALLOCATE(level, level2)
-       IF (ALLOCATED(WRFstl)) DEALLOCATE(WRFstl, stl)
-       IF (ALLOCATED(WRFswvl)) DEALLOCATE(WRFswvl, swvl)
+       IF (ALLOCATED(modlevel)) DEALLOCATE(modlevel)
+       IF (ALLOCATED(modlevel2)) DEALLOCATE(modlevel2)
+       IF (ALLOCATED(vecr)) DEALLOCATE(vecr)
+       IF (ALLOCATED(vecr1)) DEALLOCATE(vecr1)
+       IF (ALLOCATED(oDs)) DEALLOCATE(oDs)
+       IF (ALLOCATED(intimemat)) DEALLOCATE(intimemat)
+       IF (ALLOCATED(level2Dh)) DEALLOCATE(level2Dh)
+       IF (ALLOCATED(odates)) DEALLOCATE(odates)
+       IF (ALLOCATED(pfiles)) DEALLOCATE(pfiles)
+
+       IF (ALLOCATED(WRFstl)) DEALLOCATE(WRFstl)
+       IF (ALLOCATED(WRFswvl)) DEALLOCATE(WRFswvl)
+       IF (ALLOCATED(stl)) DEALLOCATE(stl)
+       IF (ALLOCATED(swvl)) DEALLOCATE(swvl)
        IF (ALLOCATED(mamask1D)) DEALLOCATE(mamask1D)
        IF (ALLOCATED(mamask2D)) DEALLOCATE(mamask2D)
        IF (ALLOCATED(mamask3D)) DEALLOCATE(mamask3D)
@@ -3497,6 +3801,7 @@ PROGRAM netcdf2wps
        IF (ALLOCATED(hurptopmod)) DEALLOCATE(hurptopmod)
        IF (ALLOCATED(husptopmod)) DEALLOCATE(husptopmod)
        IF (ALLOCATED(hurptopmod)) DEALLOCATE(hurptopmod)
+       IF (ALLOCATED(tdaptopmod)) DEALLOCATE(tdaptopmod)
        IF (ALLOCATED(plptop)) DEALLOCATE(plptop)
        IF (ALLOCATED(zgbar)) DEALLOCATE(zgbar)
        IF (ALLOCATED(zgreldiffbar)) DEALLOCATE(zgreldiffbar)
@@ -3506,6 +3811,12 @@ PROGRAM netcdf2wps
        IF (ALLOCATED(tbar)) DEALLOCATE(tbar)
        IF (ALLOCATED(taptop)) DEALLOCATE(taptop)
        IF (ALLOCATED(treldiffbar)) DEALLOCATE(treldiffbar)
+       IF (ALLOCATED(lon2D)) DEALLOCATE(lon2D)
+       IF (ALLOCATED(lat2D)) DEALLOCATE(lat2D)
+
+       IF (ALLOCATED(availinpt)) DEALLOCATE(availinpt)
+       IF (ALLOCATED(availlandoper)) DEALLOCATE(availlandoper)
+       IF (ALLOCATED(varinp)) DEALLOCATE(varinp)
 
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 END PROGRAM netcdf2wps
diff --git a/nc2wps/read_FILE.f90 b/nc2wps/read_FILE.f90
index 14503e95e6217ef37d1b0e888c60718c1f3e7135..a976079ee8971b4147ef5cade3e564da8c92d7bf 100644
--- a/nc2wps/read_FILE.f90
+++ b/nc2wps/read_FILE.f90
@@ -39,15 +39,17 @@ PROGRAM read_FILE
   INTEGER                                                :: iunit, ioerr, nout
   CHARACTER (len=8)                                      :: startloc
   INTEGER                                                :: i, j, iv, ichk, Nvars, Nvals
-  INTEGER                                                :: Nvariables, Nfullvariables
+  INTEGER                                                :: Nvariables, Nfullvariables, debug
   CHARACTER(len=20)                                      :: levS
   CHARACTER(len=500)                                     :: main, projname, outfilen, errmsg
   CHARACTER(len=30), DIMENSION(1000)                     :: variables, fullvariables
+  REAL, DIMENSION(:,:), ALLOCATABLE                      :: vals2
+  REAL                                                   :: mvals, mvals2
   LOGICAL                                                :: file_exist, tocheck, tofullcheck
   LOGICAL, DIMENSION(:,:), ALLOCATABLE                   :: mask
   CHARACTER(len=3)                                       :: iprojS
 
-  NAMELIST /input/ filename, Nvariables, variables, Nfullvariables, fullvariables
+  NAMELIST /input/ filename, Nvariables, variables, Nfullvariables, fullvariables, debug
 
   main = 'read_FILE'
 
@@ -62,6 +64,10 @@ PROGRAM read_FILE
     STOP
   END IF
 
+  ! namelist default values
+  Nfullvariables = 0
+  debug = 0
+  
   READ(iunit,input)
   close(iunit)
 
@@ -245,17 +251,43 @@ PROGRAM read_FILE
       CLOSE(nout)
       PRINT *,"  file with variable data '" // TRIM(outfilen)//"' has been written"
     END IF
+    IF (ALLOCATED(mask)) DEALLOCATE(mask)
+    ALLOCATE(mask(fg_data%nx, fg_data%ny))
+    mask = .FALSE.
+
+    mask = ABS(fg_data%slab) <= ABS(metfillvalue*0.9)
+
+    IF (ALLOCATED(vals2)) DEALLOCATE(vals2)
+    ALLOCATE(vals2(fg_data%nx, fg_data%ny))
+    vals2 = 0.
+    DO i=1, fg_data%nx
+      DO j=1, fg_data%ny
+        IF (mask(i,j)) vals2(i,j) = fg_data%slab(i,j)*fg_data%slab(i,j)
+      END DO
+    END DO
+   
+    IF (debug > 10) THEN
+      ! Printing variables values
+      DO i=1, fg_data%nx
+        PRINT *,(fg_data%slab(i,j),j=1,fg_data%ny)
+      END DO
 
-    mask = fg_data%slab /= metfillvalue
+      ! Printing mask of variable
+      DO i=1, fg_data%nx
+        PRINT *,(mask(i,j),j=1,fg_data%ny)
+      END DO
+    END IF
 
     ! Some statitistics
     Nvals = COUNT(mask)
     PRINT *, '  num. var', iv, ' '//TRIM(fg_data%field)//' at level ', fg_data%xlvl, 'num. values:',  &
       Nvals , ' _______'
     IF (Nvals /= 0) THEN 
+      mvals = SUM(fg_data%slab, mask=mask)
+      mvals2 = SUM(vals2, mask=mask)
       PRINT *, '    min:', MINVAL(fg_data%slab, mask=mask), ' max:', MAXVAL(fg_data%slab, mask=mask)
       PRINT *, '    mean:', SUM(fg_data%slab, mask=mask)/Nvals, ' stddev:',                           &
-        SQRT(SUM(fg_data%slab, mask=mask)**2/Nvals-(SUM(fg_data%slab, mask=mask)/Nvals)**2)
+        SQRT(mvals2/Nvals-(mvals/Nvals)**2)
     ELSE
       PRINT *, '    All values masked !!'
     END IF
@@ -266,4 +298,6 @@ PROGRAM read_FILE
 
   CLOSE(iunit)
   
+  IF (ALLOCATED(mask)) DEALLOCATE(mask, vals2)
+  
 END PROGRAM read_FILE