IGMBaseLib 1.0

src/util/math/rcregions_norm_check.f90

Go to the documentation of this file.
00001 
00013 module rcregions_norm_check
00014   
00015   ! モジュール引用 ; Use statement
00016   !
00017   use dc_types, only: DP  ! 倍精度実数型. Double precision. 
00018   
00019   ! 宣言文 ; Declaration statement
00020   !
00021   implicit none
00022   private
00023 
00024   ! 公開手続き
00025   ! Public procedure
00026   !
00027   public calc_norm1, calc_norm2, calc_norm3
00028 
00029   ! 公開変数
00030   ! Public variables
00031   !
00032   integer, parameter :: RC_REGIONS_NUM = 10
00033 
00034 contains
00035 
00036 !
00037 !
00038 !
00039 function calc_norm1(true_field, num_field) result(normVal)
00040   ! 宣言文 ; Declaration statements
00041   !
00042   real(DP), intent(in) :: true_field(:,:,:,:)
00043   real(DP), intent(in) :: num_field(:,:,:,:)
00044   real(DP) normVal
00045 
00046   ! 作業変数
00047   ! Work varaibles
00048   !
00049   real(DP) fieldT_sum
00050   real(DP) fieldError_sum
00051   integer :: rcID, i,j
00052   integer :: EMax
00053   
00054   ! 実行文 ; Executable statements
00055   !
00056 
00057   EMax = size(true_field, 2)
00058   fieldT_sum = 0.0d0
00059   fieldError_sum = 0.0d0
00060 
00061   do rcID=1, RC_REGIONS_NUM
00062     do j=1,EMax-1
00063       do i=2,EMax
00064         fieldError_sum = fieldError_sum + abs_Val(true_field(rcID,i,j,:) - num_field(rcID, i,j, :))
00065         fieldT_sum = fieldT_sum + abs_Val(true_field(rcID,i,j,:))
00066         
00067       end do
00068     end do
00069   end do
00070   
00071   fieldError_sum = fieldError_sum + abs_Val(true_field(1,1,1,:) - num_field(1,1,1, :))
00072   fieldT_sum = fieldT_sum + abs_Val(true_field(1,1,1,:))
00073     
00074   fieldError_sum = fieldError_sum + abs_Val(true_field(6,EMax,EMax,:) - num_field(6,EMax,EMax, :))
00075   fieldT_sum = fieldT_sum + abs_Val(true_field(6,EMax,EMax,:))
00076   
00077   normVal = fieldError_sum / fieldT_sum
00078 
00079 end function calc_norm1
00080 
00081 !
00085 function calc_norm2(true_field, num_field) result(normVal)
00086   ! 宣言文 ; Declaration statements
00087   !
00088   real(DP), intent(in) :: true_field(:,:,:,:)
00089   real(DP), intent(in) :: num_field(:,:,:,:)
00090   real(DP) normVal
00091 
00092   ! 作業変数
00093   ! Work varaibles
00094   !
00095   real(DP) fieldT_sum
00096   real(DP) fieldError_sum
00097   integer :: rcID, i,j
00098   integer :: EMax
00099 
00100 
00101   ! 実行文 ; Executable statements
00102   !
00103 
00104   EMax = size(true_field, 2)
00105   fieldT_sum = 0.0d0
00106   fieldError_sum = 0.0d0
00107 
00108   do rcID=1, RC_REGIONS_NUM
00109     do j=1,EMax-1
00110       do i=2,EMax
00111         fieldError_sum = fieldError_sum + abs_Val(true_field(rcID,i,j,:) - num_field(rcID, i,j, :))**2
00112         fieldT_sum = fieldT_sum + abs_Val(true_field(rcID,i,j,:))**2
00113       end do
00114     end do
00115   end do
00116 
00117   fieldError_sum = fieldError_sum + abs_Val(true_field(1,1,1,:) - num_field(1,1,1, :))**2
00118   fieldT_sum = fieldT_sum + abs_Val(true_field(1,1,1,:))**2
00119   
00120   fieldError_sum = fieldError_sum + abs_Val(true_field(6,EMax,EMax,:) - num_field(6,EMax,EMax, :))**2
00121   fieldT_sum = fieldT_sum + abs_Val(true_field(6,EMax,EMax,:))**2
00122   
00123   normVal = dsqrt(fieldError_sum) / dsqrt(fieldT_sum)
00124     
00125 end function calc_norm2
00126 
00127 !
00130 function calc_norm3(true_field, num_field, output_info_flag ) result(normVal)
00131   ! 宣言文 ; Declaration statements
00132   !
00133   real(DP), intent(in) :: true_field(:,:,:,:)
00134   real(DP), intent(in) :: num_field(:,:,:,:)
00135   logical, intent(in), optional :: output_info_flag
00136   real(DP) normVal
00137 
00138   ! 作業変数
00139   ! Work varaibles
00140   !
00141   real(DP) :: fieldTMax
00142   real(DP) :: fieldErrorMax
00143   real(DP) absfieldError, absfieldT 
00144   integer :: rcID, i,j
00145 
00146   integer :: max_rcID, max_i, max_j
00147   integer :: EMax
00148 
00149   ! 実行文 ; Executable statements
00150   !
00151 
00152   EMax = size(true_field, 2)
00153   fieldTMax = 0.0d0
00154   fieldErrorMax = 0.0d0
00155   max_rcID = 1; max_i = 1; max_j = 1
00156  
00157   do rcID=1, RC_REGIONS_NUM
00158     do j=1,EMax
00159       do i=1,EMax
00160         
00161         absfieldError = abs_Val(true_field(rcID,i,j,:) - num_field(rcID,i,j,:))
00162         absfieldT = abs_Val(true_field(rcID,i,j,:))
00163         
00164         if( absfieldError >= fieldErrorMax ) then
00165           fieldErrorMax = absfieldError; 
00166           max_rcID=rcID; max_i=i; max_j=j;
00167         end if
00168         
00169         if( absfieldT > fieldTMax ) then
00170           fieldTMax = absfieldT
00171          ! write(*,*) rcID, i,j, absfieldError, absfieldT
00172         end if
00173         
00174       end do
00175     end do
00176   end do
00177 
00178   normVal = fieldErrorMax / fieldTMax
00179 
00180   if ( present(output_info_flag) .and. output_info_flag ) then
00181      write(*,*) 'norm3 maximum error info:', max_rcID, max_i, max_j 
00182      write(*,*) 'fieldTMax:', fieldTMax, ', true:', true_field(max_rcID,max_i,max_j,:), ', num:',  num_field(max_rcID,max_i,max_j,:)
00183   end if
00184 end function  calc_norm3
00185 
00186 function abs_Val(errorVal) result(absVal)
00187   !
00188   !
00189   !
00190   real(DP), intent(in)  :: errorVal(:) 
00191   real(DP)absVal
00192 
00193   integer :: valDim
00194   valDim = size(errorVal, 1)
00195 
00196   if( valDim == 1 )then
00197     absVal = dabs(errorVal(1))
00198   else if( valDim == 3 ) then
00199     absVal = dsqrt(dot_product(errorVal, errorVal))
00200   else
00201     absVal = 0.0d0
00202     write(*,*) '!!!!!!!!!!!!!!!!!!!!!!!'
00203   end if
00204 
00205 end function abs_Val
00206 
00207 end module rcregions_norm_check
 All Classes Namespaces Files Functions Variables