|
大家好,
我写了一段代码。运行后,发现输出结果中出现了NaN类型的数据。我猜测可能是因为数据溢出,就是数据过小,超出了双精度复数的表示范围。但我并不确定是否是这个原因,所以我把我出问题部分的代码粘贴在下面了,麻烦大家帮我看下是否真的是因为数据溢出的错误。如果不是,麻烦大家给些建议是哪里出错了;如果是的话,麻烦大家给些建议如何判断哪些过小的双精度复数型数据,并把它们设置为零吧。多谢大家。
我的出问题部分的代码。
[Fortran] 纯文本查看 复制代码 003 | DOUBLE PRECISION , ALLOCATABLE :: kp ( : , : ) |
006 | INTEGER , ALLOCATABLE :: nd ( : ) |
007 | DOUBLE PRECISION , ALLOCATABLE :: hr ( : , : ) |
008 | DOUBLE COMPLEX , ALLOCATABLE :: tb ( : , : ) |
009 | DOUBLE COMPLEX , ALLOCATABLE :: ec ( : , : ) |
010 | DOUBLE PRECISION , ALLOCATABLE :: ev ( : , : ) |
011 | DOUBLE COMPLEX , ALLOCATABLE :: vh ( : , : ) |
012 | DOUBLE PRECISION :: fermi |
013 | DOUBLE PRECISION :: wf |
014 | DOUBLE PRECISION :: bv |
016 | DOUBLE PRECISION :: mv |
018 | DOUBLE PRECISION :: dk ( 2 ) |
019 | DOUBLE COMPLEX , ALLOCATABLE :: sr ( : , : ) |
020 | DOUBLE COMPLEX :: sr 1 ( 3 ) |
023 | INTEGER :: i , j , k , l , m |
024 | DOUBLE COMPLEX :: dc ( 3 ) |
025 | DOUBLE COMPLEX , ALLOCATABLE :: ex ( : , : ) |
026 | DOUBLE PRECISION :: de |
028 | DOUBLE PRECISION :: ey |
031 | DOUBLE COMPLEX :: gd ( 2 ) |
033 | DOUBLE COMPLEX , ALLOCATABLE :: mt 1 ( : , : ) |
034 | DOUBLE COMPLEX , ALLOCATABLE :: mt 2 ( : , : ) |
035 | DOUBLE COMPLEX , ALLOCATABLE :: mt 3 ( : , : ) |
036 | DOUBLE COMPLEX , ALLOCATABLE :: mt 4 ( : , : ) |
037 | DOUBLE COMPLEX , ALLOCATABLE :: mt 5 ( : , : ) |
038 | DOUBLE COMPLEX :: mt 6 ( 8 ) |
039 | DOUBLE COMPLEX :: sp ( 6 ) |
040 | DOUBLE PRECISION , ALLOCATABLE :: nm ( : ) |
041 | DOUBLE COMPLEX :: oc ( 3 ) |
043 | INTEGER :: omp_get_num_threads |
045 | INTEGER :: omp_get_thread_num |
047 | DOUBLE COMPLEX , ALLOCATABLE :: sr 2 ( : , : , : ) |
052 | ALLOCATE ( sr 2 ( num_thread , nv + nn , 3 ) ) |
053 | sr 2 = CMPLX ( 0.0d0 , 0.0d0 ) |
055 | DO i = 1 , nv + nn - 2 , 1 |
056 | id_thread = omp_get_thread_num ( ) + 1 |
058 | ey = mv - wf + DBLE ( i ) * de |
059 | sr 1 = CMPLX ( 0.0d0 , 0.0d0 ) |
064 | mt 1 ( 1 , : ) = DCONJG ( ec ( 1 + ( j -1 ) * nu_wa : j * nu_wa , k ) ) |
065 | mt 2 ( : , 1 ) = ec ( 1 + ( j -1 ) * nu_wa : j * nu_wa , k ) |
066 | nm ( k ) = REAL ( SUM ( MATMUL ( mt 1 , mt 2 ) ) ) |
067 | nm ( k ) = 1.0d0 / DSQRT ( nm ( k ) ) |
070 | mt 5 = vh ( 1 + ( j -1 ) * nu_wa : j * nu_wa , 1 : nu_wa ) |
072 | mt 5 = vh ( 1 + ( j -1 ) * nu_wa : j * nu_wa , 1 + nu_wa : 2 * nu_wa ) |
075 | oc = CMPLX ( 0.0d0 , 0.0d0 ) |
077 | mt 1 ( 1 , : ) = DCONJG ( ec ( 1 + ( j -1 ) * nu_wa : j * nu_wa , k ) ) |
078 | mt 2 ( : , 1 ) = ec ( 1 + ( j -1 ) * nu_wa : j * nu_wa , k ) |
079 | gr = CMPLX ( 1.0d0 , 0.0d0 ) / CMPLX ( ey - ev ( j , k ) , bv ) |
080 | ga = CMPLX ( 1.0d0 , 0.0d0 ) / CMPLX ( ey - ev ( j , k ) , 0.0d0 - bv ) |
081 | gd ( 2 ) = ( gr * gr + ga * ga ) |
083 | mt 3 ( 1 , : ) = DCONJG ( ec ( 1 + ( j -1 ) * nu_wa : j * nu_wa , l ) ) |
084 | mt 4 ( : , 1 ) = ec ( 1 + ( j -1 ) * nu_wa : j * nu_wa , l ) |
085 | gr = CMPLX ( 1.0d0 , 0.0d0 ) / CMPLX ( ey - ev ( j , l ) , bv ) |
086 | ga = CMPLX ( 1.0d0 , 0.0d0 ) / CMPLX ( ey - ev ( j , l ) , 0.0d0 - bv ) |
088 | sp = CMPLX ( 0.0d0 , 0.0d0 ) |
089 | DO m = 1 , nu_wa / 2 , 1 |
091 | mt 6 ( 2 ) = mt 2 ( m + nu_wa / 2 , 1 ) |
093 | mt 6 ( 4 ) = mt 3 ( 1 , m + nu_wa / 2 ) |
095 | mt 6 ( 6 ) = mt 1 ( 1 , m + nu_wa / 2 ) |
097 | mt 6 ( 8 ) = mt 4 ( m + nu_wa / 2 , 1 ) |
098 | sp ( 1 ) = sp ( 1 ) + mt 6 ( 4 ) * mt 6 ( 1 ) + mt 6 ( 3 ) * mt 6 ( 2 ) |
099 | sp ( 2 ) = sp ( 2 ) + dc ( 1 ) * ( mt 6 ( 4 ) * mt 6 ( 1 ) - mt 6 ( 3 ) * mt 6 ( 2 ) ) |
100 | sp ( 3 ) = sp ( 3 ) + mt 6 ( 3 ) * mt 6 ( 1 ) - mt 6 ( 4 ) * mt 6 ( 2 ) |
101 | sp ( 4 ) = sp ( 4 ) + mt 6 ( 6 ) * mt 6 ( 7 ) + mt 6 ( 5 ) * mt 6 ( 8 ) |
102 | sp ( 5 ) = sp ( 5 ) + dc ( 1 ) * ( mt 6 ( 6 ) * mt 6 ( 7 ) - mt 6 ( 5 ) * mt 6 ( 8 ) ) |
103 | sp ( 6 ) = sp ( 6 ) + mt 6 ( 5 ) * mt 6 ( 7 ) - mt 6 ( 6 ) * mt 6 ( 8 ) |
105 | su = ( SUM ( MATMUL ( mt 1 , MATMUL ( mt 5 , mt 4 ) ) ) * sp ( 1 ) - sp ( 4 ) * SUM ( MATMUL ( mt 3 , MATMUL ( mt 5 , mt 2 ) ) ) ) / CMPLX ( 2.0d0 , 0.0d0 ) |
106 | oc ( 1 ) = oc ( 1 ) + su * gd ( 1 ) * gd ( 2 ) * CMPLX ( de , 0.0d0 ) * nm ( k ) * nm ( k ) * nm ( l ) * nm ( l ) * dk ( 1 ) * dk ( 2 ) |
107 | su = ( SUM ( MATMUL ( mt 1 , MATMUL ( mt 5 , mt 4 ) ) ) * sp ( 2 ) - sp ( 5 ) * SUM ( MATMUL ( mt 3 , MATMUL ( mt 5 , mt 2 ) ) ) ) / CMPLX ( 2.0d0 , 0.0d0 ) |
108 | oc ( 2 ) = oc ( 2 ) + su * gd ( 1 ) * gd ( 2 ) * CMPLX ( de , 0.0d0 ) * nm ( k ) * nm ( k ) * nm ( l ) * nm ( l ) * dk ( 1 ) * dk ( 2 ) |
109 | su = ( SUM ( MATMUL ( mt 1 , MATMUL ( mt 5 , mt 4 ) ) ) * sp ( 3 ) - sp ( 6 ) * SUM ( MATMUL ( mt 3 , MATMUL ( mt 5 , mt 2 ) ) ) ) / CMPLX ( 2.0d0 , 0.0d0 ) |
110 | oc ( 3 ) = oc ( 3 ) + su * gd ( 1 ) * gd ( 2 ) * CMPLX ( de , 0.0d0 ) * nm ( k ) * nm ( k ) * nm ( l ) * nm ( l ) * dk ( 1 ) * dk ( 2 ) |
113 | sr 1 ( 1 ) = sr 1 ( 1 ) + ex ( i , 2 ) * oc ( 3 ) - ex ( i , 3 ) * oc ( 2 ) |
114 | sr 1 ( 2 ) = sr 1 ( 2 ) + ex ( i , 3 ) * oc ( 1 ) - ex ( i , 1 ) * oc ( 3 ) |
115 | sr 1 ( 3 ) = sr 1 ( 3 ) + ex ( i , 1 ) * oc ( 2 ) - ex ( i , 2 ) * oc ( 1 ) |
116 | write ( unit = * , fmt = * ) 'T_x_interpolating' , ex ( i , 2 ) * oc ( 3 ) - ex ( i , 3 ) * oc ( 2 ) |
117 | write ( unit = * , fmt = * ) 'T_y_interpolating' , ex ( i , 3 ) * oc ( 1 ) - ex ( i , 1 ) * oc ( 3 ) |
118 | write ( unit = * , fmt = * ) 'T_z_interpolating' , ex ( i , 1 ) * oc ( 2 ) - ex ( i , 2 ) * oc ( 1 ) |
121 | sr 2 ( id_thread , 1 + i , 1 ) = sr 1 ( 1 ) |
122 | sr 2 ( id_thread , 1 + i , 2 ) = sr 1 ( 2 ) |
123 | sr 2 ( id_thread , 1 + i , 3 ) = sr 1 ( 3 ) |
输出的部分结果如下。
T_z_interpolating (0.000000000000000E+000,0.000000000000000E+000)
T_y_interpolating (-7.844408716089390E-318,-1.627452237401066E-320)
T_z_interpolating (0.000000000000000E+000,0.000000000000000E+000)
T_x_interpolating (NaN,NaN)
T_y_interpolating (NaN,NaN)
T_z_interpolating (0.000000000000000E+000,0.000000000000000E+000)
T_x_interpolating (-4.748344416916300E-003,-2.184128388170520E-010)
T_y_interpolating (3.377560741471222E-008,4.832304342329601E-011)
T_y_interpolating (0.000000000000000E+000,0.000000000000000E+000)
T_z_interpolating (7.890054335804031E-008,-2.098265883494228E-010)
T_x_interpolating (NaN,NaN)
T_y_interpolating (0.000000000000000E+000,0.000000000000000E+000)
T_z_interpolating (NaN,NaN)
T_x_interpolating (3.764965159798266E-007,7.032141314956383E-022)
T_x_interpolating (1.435727593204141E-317,-1.963519148161803E-317)
T_y_interpolating (9.405725326138147E-319,9.193968790330589E-319)
T_z_interpolating (3.839154229161444E-006,2.624325922453405E-010)
T_x_interpolating (NaN,NaN)
T_y_interpolating (0.000000000000000E+000,0.000000000000000E+000)
T_z_interpolating (NaN,NaN)
T_x_interpolating (-0.166424638577942,7.705225622188310E-013)
T_y_interpolating (0.000000000000000E+000,0.000000000000000E+000)
T_z_interpolating (5.576638611415991E-002,1.704192603919102E-011)
T_x_interpolating (NaN,NaN)
T_y_interpolating (0.000000000000000E+000,0.000000000000000E+000)
T_z_interpolating (NaN,NaN)
T_x_interpolating (NaN,NaN)
T_y_interpolating (0.000000000000000E+000,0.000000000000000E+000)
T_z_interpolating (NaN,NaN)
T_x_interpolating (9.167435739615091E-005,-3.946845693068038E-020)
T_y_interpolating (0.000000000000000E+000,0.000000000000000E+000)
麻烦大家给些建议吧。谢谢啦。
|
|