psmile_gridless_func_real.F90

Go to the documentation of this file.
00001 !-----------------------------------------------------------------------
00002 ! $COPYRIGHT_CERFACS
00003 ! $COPYRIGHT_SGI
00004 ! $COPYRIGHT_CCRL
00005 !-----------------------------------------------------------------------
00006 !BOP
00007 !
00008 ! !ROUTINE: psmile_gridless_func_real
00009 !
00010 ! !INTERFACE:
00011 
00012    subroutine psmile_gridless_func_real ( field_id, userdef_id, il_side, data_array, ierror )
00013 !
00014 ! !USES:
00015 !
00016       use PSMILe
00017 
00018       implicit none
00019 !
00020 ! !INPUT PARAMETERS:
00021 !
00022       Integer, Intent (In)  :: field_id
00023 
00024 !  handle in Userdefs global structures   field_id of the geographical function
00025 
00026       Integer, Intent (In)  :: userdef_id
00027 
00028 !  handle in Userdefs global structures   userdef_id associated to field_id
00029 
00030       Integer, Intent (In)  :: il_side
00031 
00032 !  flag = 0 for the "source" side,  = 1 for the "target" side
00033 
00034       Real, Intent (InOut)  :: data_array(*)
00035 
00036 !  The data (geographical function) itself
00037 
00038 !  OUTPUT PARAMETER:
00039 
00040       Integer, Intent (Out) :: ierror
00041 
00042 !     error return code
00043 
00044 !  LOCAL VARIABLES:
00045 
00046       Integer                   :: i
00047       Integer                   :: imaxg, il_celldim
00048       Integer                   :: iloc, ilink
00049       Integer                   :: indi, indj, indk
00050       Integer                   :: dim1, dim2, dim3
00051       Integer                   :: ijklin, ijkdat, ndim
00052       Integer                   :: il_nbdl, ibd
00053 
00054       Type(Userdef), POINTER    :: ug
00055       Type(GridFunction), POINTER    :: fp
00056 
00057 
00058 !   user-defined interpolation : set pointer to Userdefs structures
00059 
00060       ierror = 0
00061       ug => Userdefs(userdef_id)
00062       imaxg      = ug%ig_nb_ppp
00063       il_celldim = ug%ig_celldim
00064       print *, ' psmile_gridless_func_real : imaxg = ',imaxg
00065 
00066 !   Fill relevant values from the user-defined links
00067 !   data_array must be used as a one-dimension array.
00068     
00069       fp => Fields(field_id)
00070       ndim = Grids(Methods(fp%method_id)%grid_id)%n_dim   ! dimension of geographical function
00071       print *, ' psmile_gridless_func_real : ndim = ',ndim
00072 !
00073 !  Verifier (prism assertion) que il_celldim = ndim
00074 !
00075          dim1 = fp%var_shape(2,1) - fp%var_shape(1,1) + 1
00076       print *, ' dim1 = ', dim1
00077          dim2 = fp%var_shape(2,2) - fp%var_shape(1,2) + 1
00078       print *, ' dim2 = ', dim2
00079       if ( ndim == 3 ) then
00080          dim3 = fp%var_shape(2,3) - fp%var_shape(1,3) + 1
00081       print *, ' dim3 = ', dim3
00082       endif
00083 
00084 !  Number of fields ( = 1, if no bundle,  > 1 if bundles )
00085       il_nbdl = ug%ig_nbr_fields
00086 !
00087 !  Side-dependent code : 0 (source) data_array is input
00088 !                        1 (target) data_array is output
00089 
00090       if ( il_side == 0 ) then
00091 
00092 !   Source side : ug%real_gridless is output (gridless function)
00093 !!!        if ( ug%lg_nolink ) then
00094 !     Case of a fake link (nothing to send in fact)
00095 !!!           ug%dble_gridless(1,1,1,1) = 0.0
00096 !!!        else
00097 !     Normal case : user_defined links with non-zero weigh
00098           if ( ndim == 3 ) then
00099 !   Specific to Three-dimensional grid
00100             do iloc = 1, imaxg
00101                indi  = ug%iga_igl(iloc,1) - fp%var_shape(1,1) + 1
00102                indj  = ug%iga_igl(iloc,2) - fp%var_shape(1,2) + 1 
00103                indk  = ug%iga_igl(iloc,3) - fp%var_shape(1,3) + 1
00104                ilink = ug%iga_igl(iloc,4)
00105                ijklin = indi + dim1*(indj-1) + dim1*dim2*(indk-1)
00106 #ifdef DEBUG
00107                print *, 'indi-j-k  ilink = ',indi, indj, indk, ilink
00108                print *, 'ijkdat  et data = ',ijklin, data_array(ijklin)
00109 #endif
00110                do ibd = 1, il_nbdl
00111                   ijkdat = ijklin + dim1*dim2*dim3*(ibd-1)
00112                   ug%real_gridless(iloc,1,1,ibd) = &
00113                       (ug%dga_wght(iloc)) * data_array(ijkdat)
00114                enddo
00115             enddo
00116           endif
00117 !
00118           if ( ndim == 2 ) then
00119 !   Specific to Two-dimensional grid
00120             do iloc = 1, imaxg
00121                indi  = ug%iga_igl(iloc,1) - fp%var_shape(1,1) + 1
00122                indj  = ug%iga_igl(iloc,2) - fp%var_shape(1,2) + 1
00123                ilink = ug%iga_igl(iloc,4)
00124                ijklin = indi + dim1*(indj-1)
00125 #ifdef DEBUG
00126                print *, 'indi-j  ilink = ',indi, indj, ilink
00127                print *, 'ijkdat  et data = ',ijklin, data_array(ijklin)
00128 #endif
00129                do ibd = 1, il_nbdl
00130                   ijkdat = ijklin + dim1*dim2*(ibd-1)
00131                   ug%real_gridless(iloc,1,1,ibd) = &
00132                      (ug%dga_wght(iloc)) * data_array(ijkdat)
00133                enddo
00134             enddo
00135           endif
00136 !!!        endif        ! lg_nolink
00137 
00138       elseif (il_side == 1 ) then
00139 !   Target side : ug%real_gridless is input, and data_array is output
00140 !!!        if ( .NOT.ug%lg_nolink ) then
00141           if ( ndim == 3 ) then
00142             do iloc = 1, imaxg
00143                indi  = ug%iga_igl(iloc,1) - fp%var_shape(1,1) + 1
00144                indj  = ug%iga_igl(iloc,2) - fp%var_shape(1,2) + 1
00145                indk  = ug%iga_igl(iloc,3) - fp%var_shape(1,3) + 1
00146                ilink = ug%iga_igl(iloc,4)
00147                ijklin = indi + dim1*(indj-1) + dim1*dim2*(indk-1)
00148 #ifdef DEBUG
00149                print *, 'indi-j-k  ilink = ',indi, indj, indk, ilink
00150 #endif
00151                do ibd = 1, il_nbdl
00152                   ijkdat = ijklin + dim1*dim2*dim3*(ibd-1)
00153                   data_array(ijkdat) = data_array(ijkdat) +  &
00154                                        ug%real_gridless(iloc,1,1,ibd) 
00155 #ifdef DEBUG
00156                   print *, 'ijkdat  et data = ',ijkdat, data_array(ijkdat)
00157 #endif
00158                enddo
00159             enddo
00160           endif
00161 
00162           if ( ndim == 2 ) then
00163             do iloc = 1, imaxg
00164                indi  = ug%iga_igl(iloc,1) - fp%var_shape(1,1) + 1
00165                indj  = ug%iga_igl(iloc,2) - fp%var_shape(1,2) + 1
00166                ilink = ug%iga_igl(iloc,4)
00167 #ifdef DEBUG
00168                print *, 'indi-j-k  ilink = ',indi, indj, ilink
00169 #endif
00170                ijklin = indi + dim1*(indj-1) 
00171                do ibd = 1, il_nbdl
00172                   ijkdat = ijklin + dim1*dim2*(ibd-1)
00173                   data_array(ijkdat) = data_array(ijkdat) +  &
00174                                        ug%real_gridless(iloc,1,1,ibd)
00175 #ifdef DEBUG
00176                   print *, 'ijkdat  et data = ',ijkdat, data_array(ijkdat)
00177 #endif
00178                enddo
00179             enddo
00180           endif
00181 !!!        endif   ! lg_nolink
00182 
00183       endif     ! il_side
00184 
00185 #ifdef DEBUG
00186       PRINT *, ' local values of function on gridless grid (j = k = 1) '
00187       PRINT *, (ug%real_gridless(i,1,1,1),i=1,imaxg)
00188 #endif
00189 
00190       return
00191       end subroutine psmile_gridless_func_real

Generated on 18 Mar 2011 for Oasis4 by  doxygen 1.6.1