00001 subroutine search_emdmax_xaxis(iremax,emdmax,xsol)
00002 use phys_constant, only : long
00003 use grid_parameter, only : nrf, ntfxy
00004 use coordinate_grav_r, only : rg
00005 use def_matter, only : emd
00006 implicit none
00007 real(long) :: emdmax, xsol, minB, niA, sqrtD
00008 real(long) :: emdmaxp, emdmaxm, xsolp, xsolm
00009 real(long) :: x(4), f(4), x1, x2, x3, x4, f1, f2, f3, f4,
00010 x12, x13, x14, x21, x23, x24, &
00011 x31, x32, x34, x41, x42, x43
00012 integer :: ir, iremax, ir0
00013 real(long), external :: lagint_4th
00014
00015
00016 if (iremax.eq.0) then
00017 emdmax = emd(iremax,ntfxy,0)
00018 xsol = rg(0)
00019 return
00020 else
00021 ir0 = iremax-1
00022 if (emd(iremax-1,ntfxy,0).gt.emd(iremax+1,ntfxy,0)) ir0=max0(0,iremax-2)
00023 x(1:4) = rg(ir0:ir0+3)
00024 f(1:4) = emd(ir0:ir0+3,ntfxy,0)
00025 x1 = x(1) ; x2 = x(2) ; x3 = x(3) ; x4 = x(4)
00026 f1 = f(1) ; f2 = f(2) ; f3 = f(3) ; f4 = f(4)
00027 x12 = x(1)-x(2)
00028 x13 = x(1)-x(3)
00029 x14 = x(1)-x(4)
00030 x21 = x(2)-x(1)
00031 x23 = x(2)-x(3)
00032 x24 = x(2)-x(4)
00033 x31 = x(3)-x(1)
00034 x32 = x(3)-x(2)
00035 x34 = x(3)-x(4)
00036 x41 = x(4)-x(1)
00037 x42 = x(4)-x(2)
00038 x43 = x(4)-x(3)
00039
00040 minB = f4*x1*x12*x13*x14*x21*x23*x24*x31*x32*x34 + &
00041 & f4*x12*x13*x14*x2*x21*x23*x24*x31*x32*x34 + &
00042 & f4*x12*x13*x14*x21*x23*x24*x3*x31*x32*x34 + &
00043 & f3*x1*x12*x13*x14*x21*x23*x24*x41*x42*x43 + &
00044 & f3*x12*x13*x14*x2*x21*x23*x24*x41*x42*x43 + &
00045 & f2*x1*x12*x13*x14*x31*x32*x34*x41*x42*x43 + &
00046 & f1*x2*x21*x23*x24*x31*x32*x34*x41*x42*x43 + &
00047 & f2*x12*x13*x14*x3*x31*x32*x34*x41*x42*x43 + &
00048 & f1*x21*x23*x24*x3*x31*x32*x34*x41*x42*x43 + &
00049 & f3*x12*x13*x14*x21*x23*x24*x4*x41*x42*x43 + &
00050 & f2*x12*x13*x14*x31*x32*x34*x4*x41*x42*x43 + &
00051 & f1*x21*x23*x24*x31*x32*x34*x4*x41*x42*x43
00052
00053 sqrtD=dsqrt((f4*x12*x13*x14*x21*x23*x24*(x1 + x2 + x3)*x31*x32*x34 + &
00054 & (f3*x12*x13*x14*x21*x23*x24*(x1 + x2 + x4) + &
00055 & x31*x32*x34*(f2*x12*x13*x14*(x1 + x3 + x4) + &
00056 & f1*x21*x23*x24*(x2 + x3 + x4)))*x41*x42*x43)**2 - &
00057 & 3*(f4*x12*x13*x14*x21*x23*x24*x31*x32*x34 + &
00058 & (f3*x12*x13*x14*x21*x23*x24 + &
00059 & (f2*x12*x13*x14 + f1*x21*x23*x24)*x31*x32*x34)*x41*x42*x43) &
00060 & *(f4*x12*x13*x14*x21*x23*x24*(x2*x3 + x1*(x2 + x3))*x31*x32* &
00061 & x34 + (f3*x12*x13*x14*x21*x23*x24*(x2*x4 + x1*(x2 + x4)) + &
00062 & x31*x32*x34*(f2*x12*x13*x14*(x3*x4 + x1*(x3 + x4)) + &
00063 & f1*x21*x23*x24*(x3*x4 + x2*(x3 + x4))))*x41*x42*x43))
00064
00065 niA = 3.*(f4*x12*x13*x14*x21*x23*x24*x31*x32*x34 + &
00066 & (f3*x12*x13*x14*x21*x23*x24 + &
00067 & (f2*x12*x13*x14 + f1*x21*x23*x24)*x31*x32*x34)*x41*x42*x43)
00068
00069 xsolp = (minB + sqrtD)/niA
00070 xsolm = (minB - sqrtD)/niA
00071
00072 emdmaxp = lagint_4th(x,f,xsolp)
00073 emdmaxm = lagint_4th(x,f,xsolm)
00074
00075 emdmax = emdmaxp
00076 xsol = xsolp
00077 if (emdmaxm.gt.emdmaxp) then
00078 emdmax = emdmaxm
00079 xsol = xsolm
00080 end if
00081
00082 end if
00083
00084 end subroutine search_emdmax_xaxis