本帖最后由 岸边的鱼 于 2014-5-14 10:49 编辑
希望大家能给与指点,谢谢
我想使用Fortran语言编程求解如下一个偏微分方程组:
总结下我要求解的方程组即是上面的(4)(5)(6)式,我的FORTRAN程序是:
[Fortran] 纯文本查看 复制代码 003 | integer , parameter :: N = 1000 |
004 | real ( kind = 8 ) , parameter :: dx = 1000 .d 0 |
005 | real ( kind = 8 ) , parameter :: dy = 1000 .d 0 |
006 | real ( kind = 8 ) , parameter :: dis = 200000 .d 0 |
007 | integer ( kind = 8 ) , parameter :: M = - int ( dis / dx ) |
008 | real ( kind = 8 ) , parameter :: tao = 0.00036d0 |
009 | real ( kind = 8 ) , parameter :: v_F = 5.556d0 |
010 | real ( kind = 8 ) , parameter :: h = 10 .d 0 |
011 | real ( kind = 8 ) , parameter :: detp = 00 .d 0 / ( 1030 .d 0 * 9.8d0 ) |
012 | real ( kind = 8 ) , parameter :: pi = 3.1415926535898d0 |
013 | real ( kind = 8 ) , parameter :: f = 0.0000773336d0 |
014 | real ( kind = 8 ) , parameter :: rho = 1030 .d 0 |
015 | real ( kind = 8 ) , parameter :: g = 9.8d0 |
016 | real ( kind = 8 ) , parameter :: ro = 100000 .d 0 |
017 | real ( kind = 8 ) , parameter :: alpha = 1 E -10 |
018 | real ( kind = 8 ) , parameter :: lamda = 1 E -10 |
019 | real ( kind = 8 ) , parameter :: EPS = 1 E -28 |
025 | FunctionB_u ( v , zeta , i , j , cishu ) |
027 | real ( kind = 8 ) :: B_u , P_Dx , P_Dx_ZH , P_Dx_DD , ii , jj , P_Dxx |
028 | real ( kind = 8 ) :: v ( M : N + M , - N -1 : N +1 ) |
029 | real ( kind = 8 ) :: zeta ( M : N + M , - N : N ) , ii_ 2 , jj_ 2 |
035 | B_u = - dy * f / ( 2 .d 0 * V_F ) * ( v ( i , j +1 ) + v ( i -1 , j +1 ) + v ( i -1 , j ) + v ( i , j ) ) & |
036 | +2 .d 0 * g * dy / ( V_F * dx ) * ( zeta ( i , j ) - zeta ( i -1 , j ) ) & |
037 | + ( 4 .d 0 * dy * g * alpha * detp / V_F ) * ii & |
038 | * dexp ( - alpha * ii_ 2 - lamda * jj_ 2 ) & |
039 | + ( 2 .d 0 * dy * tao * ro * * 4 .d 0 / ( rho * h * V_F ) ) / ( ( ro * ro + ii_ 2 + jj_ 2 ) * * 2 .d 0 ) & |
040 | * ( ii / 2 .d 0 + ( dsqrt ( 3 .d 0 ) / 2 .d 0 ) * jj ) |
044 | FunctionB_v ( u , zeta , i , j , cishu ) |
046 | real ( kind = 8 ) :: B_v , P_Dy_ZH , ii , jj , ii_ 2 , jj_ 2 |
047 | real ( kind = 8 ) :: u ( M : N + M +1 , - N : N ) |
048 | real ( kind = 8 ) :: zeta ( M : N + M , - N : N ) |
049 | integer :: i , j , cishu , cishu_S_P_Dy |
054 | B_v = f * dy / ( 2 .d 0 * V_F ) * ( u ( i , j ) + u ( i , j -1 ) + u ( i +1 , j -1 ) + u ( i +1 , j ) ) & |
055 | + ( 2 .d 0 * g / V_F ) * ( zeta ( i , j ) - zeta ( i , j -1 ) ) & |
056 | +4 .d 0 * g * lamda * detp * ( dy / V_F ) * jj * dexp ( - alpha * ii_ 2 - lamda * jj_ 2 ) & |
057 | - ( 2 .d 0 * tao * ro * * 4 .d 0 * dy / ( rho * h * V_F ) ) / ( ( ro * ro + ii_ 2 + jj_ 2 ) * * 2.0 ) & |
058 | * ( dsqrt ( 3 .d 0 ) / 2 .d 0 * ii - jj / 2 .d 0 ) |
062 | Function B_zeta ( u , v , i , j ) |
065 | real ( kind = 8 ) :: u ( M : N + M +1 , - N : N ) |
066 | real ( kind = 8 ) :: v ( M : N + M , - N -1 : N +1 ) |
068 | B_zeta = ( 2 .d 0 * h * dy / ( V_F * dx ) ) * ( u ( i +1 , j ) - u ( i , j ) ) & |
069 | + ( 2 .d 0 * h / V_F ) * ( v ( i , j +1 ) - v ( i , j ) ) |
079 | real ( kind = 8 ) :: ii , jj , P_Dx |
080 | real ( kind = 8 ) :: u 0 ( M : N + M +1 , - N : N ) , v 0 ( M : N + M , - N -1 : N +1 ) |
082 | real ( kind = 8 ) :: u 1 ( M : N + M +1 , - N : N ) , v 1 ( M : N + M , - N -1 : N +1 ) |
086 | integer :: cishu_u , cishu_v , cishu_zeta |
087 | character * 80 :: filename |
088 | open ( 30 , file = 'P_Dy_ZH.dat' ) |
089 | open ( 20 , file = 'P_Dx_ZH.dat' ) |
105 | 100 write ( * , * ) "迭代次数" , cishu |
108 | write ( filename , FMT = '(I6.6,A4)' ) cishu_u , '.dat' |
109 | filename = trim ( filename ) |
110 | open ( 100 , file = filename , status = 'unknown' ) |
113 | if ( i == 300 .or. i == 600 ) then |
114 | write ( * , * ) i , 'I' 'm_u' |
119 | u 1 ( i , j +1 ) = u 1 ( i , j -1 ) + B_u ( v 0 , zeta 0 , i , j , cishu ) |
120 | write ( 100 , * ) ii , jj , u 1 ( i , j +1 ) |
126 | write ( filename , FMT = '(I6.6,A4)' ) cishu_v , '.dat' |
127 | filename = trim ( filename ) |
128 | open ( 101 , file = filename , status = 'unknown' ) |
131 | if ( i == 300 .or. i == 600 ) then |
132 | write ( * , * ) i , 'I' 'm_v' |
137 | v 1 ( i , j +1 ) = v 1 ( i , j -1 ) + B_v ( u 0 , zeta 0 , i , j , cishu ) |
138 | write ( 101 , * ) ii , jj , v 1 ( i , j +1 ) |
143 | cishu_zeta = cishu +30000 |
144 | write ( filename , FMT = '(I6.6,A4)' ) cishu_zeta , '.dat' |
145 | filename = trim ( filename ) |
146 | open ( 1001 , file = filename , status = 'unknown' ) |
149 | if ( i == 300 .or. i == 600 ) then |
150 | write ( * , * ) i , 'Im_zeta' |
154 | zeta 1 ( i , j +1 ) = zeta 1 ( i , j -1 ) + B_zeta ( u 1 , v 1 , i , j ) |
155 | write ( 1001 , * ) ii , jj , zeta 1 ( i , j +1 ) |
161 | [ align = left ] do i = M , N + M |
163 | dx 2 = dx 2 + ( u 1 ( i , j ) - u 0 ( i , j ) ) * * 2 .d 0 + ( v 1 ( i , j ) - v 0 ( i , j ) ) * * 2 .d 0 |
164 | + ( zeta 1 ( i , j ) - zeta 0 ( i , j ) ) * * 2 .d 0 |
计算显示计算不收敛。。求助各位大神帮忙看下是程序的问题还是本身这种方法就是不收敛的?
|