Thanks mathmate. Yes I have used a lot of data. Actually that subroutine i used make a big matrix (5103x5103), and make it banded as (156x5103), and call for linear solver. herte is that code.
SUBROUTINE CALC_PORO_SOL_BANDED (nN,refNode,nE,npE,ELEM,BAND_WIDTH,nN_W_B,Wellbore_Boundary_Node,nN_O_B,Outer_Boundary_Node, &
& NEW_nN_X,X_axis_Node,nN_Y,Y_axis_Node,Permiab,Mue,d_T,CT,Phi,ALPHA,D,Curr_Pw,Prev_Pw,S_DISP_LOAD,S_PRESS_LOAD,S_UxSol,S_UySol,S_PSol)
INTEGER :: i,nN,nE,npE,nN_O_B,nN_W_B,NEW_nN_X,nN_Y,BAND_WIDTH,NUCA,NLCA,ROW,COL
REAL ::ALPHA,Mue,d_T,CT,Phi,Curr_Pw,Prev_Pw,MAX_BANDED_PORO_MASS_MAT
INTEGER :: ELEM(nE,npE),X_axis_Node(NEW_nN_X),Y_axis_Node(nN_Y),Wellbore_Boundary_Node(nN_W_B),&
& Outer_Boundary_Node(nN_O_B)
REAL:: refNode(nN,2),S_UxSol(nN),S_UySol(nN),S_PSol(nN),Permiab(2),D(3,3), &
& S_PRESS_LOAD(nN),S_DISP_LOAD(nN*2)
REAL,DIMENSION(:),ALLOCATABLE ::M_Load,TotSol
REAL,DIMENSION(:,:),ALLOCATABLE::BANDED_PORO_MASS_MAT
ALLOCATE(TotSol(nN*3),M_Load(nN*3),BANDED_PORO_MASS_MAT(2*BAND_WIDTH+1,nN*3))
!INITIALIZED THE DISPLACEMENT
!TotSol=0.0;S_UxSol=0.0;S_UySol=0.0;S_PSol=0.0
NUCA=BAND_WIDTH
NLCA=BAND_WIDTH
ROW=0;COL=0
M_Load=0.0
DO i=1,nN
M_Load(i*3-2)=S_DISP_LOAD(i*2-1)
M_Load(i*3-1)=S_DISP_LOAD(i*2)
M_Load(i*3)=S_PRESS_LOAD(i)
END DO
!THIS METHOD WILL CALCULATE THE MASS MATRIX (156x5013)!
CALL CAL_BANDED_GLOBAL_MASS_MATRIX(nN,refNode,nE,npE,ELEM,BAND_WIDTH,Permiab,Mue,d_T,CT,Phi,Alpha,D,BANDED_PORO_MASS_MAT)
MAX_BANDED_PORO_MASS_MAT=MAXVAL(BANDED_PORO_MASS_MAT)
MAX_BANDED_PORO_MASS_MAT=MAX_BANDED_PORO_MASS_MAT*100000.0
!################################## FOR KNOWN PRESSURE #########################################
DO i=1,nN_W_B
ROW=Wellbore_Boundary_Node(i)*3
COL=ROW
M_Load(ROW)=(Curr_Pw-Prev_Pw)*MAX_BANDED_PORO_MASS_MAT
BANDED_PORO_MASS_MAT(ROW+NUCA+1-COL,COL)=BANDED_PORO_MASS_MAT(ROW+NUCA+1-COL,COL)+MAX_BANDED_PORO_MASS_MAT
END DO
!################################## FOR KNOWN DISPLACEMENT #########################################
!FOR X AND Y AXIS NODE EXCEPT FREE NODE
DO i=1,NEW_nN_X !FOR X AXIS NODE EXCEPT FREE NODE FOR FRACTURE Y DISPLACEMENT IS ZERO
ROW=X_axis_Node(i)*3-1
COL=ROW
M_Load(ROW)=0.0 !0.0*MAX_BANDED_PORO_MASS_MAT
BANDED_PORO_MASS_MAT(ROW+NUCA+1-COL,COL)=BANDED_PORO_MASS_MAT(ROW+NUCA+1-COL,COL)+MAX_BANDED_PORO_MASS_MAT
END DO
DO i=1,nN_Y !FOR X AXIS NODE X DISPLACEMENT IS ZERO
ROW=Y_axis_Node(i)*3-2
COL=ROW
M_Load(ROW)=0.0 !0.0*MAX_BANDED_PORO_MASS_MAT
BANDED_PORO_MASS_MAT(ROW+NUCA+1-COL,COL)=BANDED_PORO_MASS_MAT(ROW+NUCA+1-COL,COL)+MAX_BANDED_PORO_MASS_MAT
END DO
CALL LSLRB (nN*3, BANDED_PORO_MASS_MAT, NLCA+NUCA+1, NLCA, NUCA,M_Load , 1, TotSol)
!REARRANGE THE PRESSURE AND DISPLACEMENT
Do i=1,nN
S_UxSol(i)=TotSol(i*3-2)
S_UySol(i)=TotSol(i*3-1)
S_PSol(i)=TotSol(i*3)
End Do
DEALLOCATE(BANDED_PORO_MASS_MAT)
DEALLOCATE(M_Load)
DEALLOCATE(TotSol)
END SUBROUTINE CALC_PORO_SOL_BANDED
This subroutine give me the solution.I call this subroutine from another two module those are called from main.
MODULE PORO_DISPL_WITH_GAUSS_PRESS
USE PORO_BNDRY_LOAD
USE GLOBAL_MASS_MATRIX_BANDED
USE PORO_FRAC_LOAD
USE BASIC_CALC
USE MSIMSL
USE PORTLIB
IMPLICIT NONE
PUBLIC CALC_DISPLMNT_WITH_GAUSS_PRESS
PRIVATE CALC_PORO_SOL_BANDED_2
CONTAINS
!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SUBROUTINE CALC_DISPLMNT_WITH_GAUSS_PRESS(nN,refNode,nN_W_B,Wellbore_Boundary_Node,n_WB_E, &
& N_TOTAL_FRAC_ELEM,NO_FREE_ELEM,nN_X,FRAC_X_AXIS_NODE,Curr_Pw,Prev_S_Prop_Pw,STEP, &
& Sigma_XX_INIT,Sigma_YY_INIT,REF_LEL_FRAC_ELEM,M2_Matr,Prev_P_P,nE,npE,ELEM,BAND_WIDTH, &
& nN_O_B,Outer_Boundary_Node,NO_New_KN_X_Axis_Node,New_KN_X_Axis_Node,nN_Y,Y_axis_Node, &
& Permiab,Mue,del_T_g,CT,Phi,ALPHA,D,PORO_DISPL_BNDY_LOAD,del_Ux,del_Uy,del_P)
INTEGER :: STEP,nN,nE,npE,BAND_WIDTH,NO_NEW_KN_X_AXIS_NODE,nN_X,nN_Y,NN_O_B,nN_W_B,N_WB_E,N_TOTAL_FRAC_ELEM,NO_FREE_ELEM
INTEGER :: New_KN_X_Axis_Node(NO_NEW_KN_X_AXIS_NODE),FRAC_X_AXIS_NODE(nN_X),Y_axis_Node(nN_Y),OUTER_BOUNDARY_NODE(NN_O_B), &
& WELLBORE_BOUNDARY_NODE(nN_W_B),REF_LEL_FRAC_ELEM(N_TOTAL_FRAC_ELEM,4),ELEM(nE,npE)
REAL :: ALPHA,Prev_S_Prop_Pw,CURR_PW,del_T_g,Permiab(2),Mue,CT,Phi
REAL :: refNode(nN,2),FRACTURED_DISP_LOAD(nN*2),PRESS_LOAD(nN),del_Ux(nN),del_Uy(nN),del_P(nN),Sigma_XX_INIT(nN),Sigma_YY_INIT(nN),M2_Matr(nN,nN),&
& DISP_LOAD(2*nN),PORO_DISPL_BNDY_LOAD(2*nN),Prev_P_P(nN),D(3,3)
!THIS FUNCTION WILL CALCULATE THE DISPL LOAD ALONG BOUNDARY
PORO_DISPL_BNDY_LOAD=0.0
CALL CALC_PORO_ELAS_DISPL_WELLBORE_BNDY_LOAD(nN,refNode,nN_W_B,Wellbore_Boundary_Node,n_WB_E,Prev_S_Prop_Pw,Curr_Pw,PORO_DISPL_BNDY_LOAD)
!THIS FUNCTION WILL CALCULATE THE DISPL LOAD ALONG FRACTURE
FRACTURED_DISP_LOAD=0.0
CALL CALC_PORO_FRACTURED_DISPL_LOAD_WITH_GAUSS_BHP(nN,refNode,N_TOTAL_FRAC_ELEM,NO_FREE_ELEM,nN_X,FRAC_X_AXIS_NODE, &
& Curr_Pw,Prev_S_Prop_Pw,STEP,Sigma_XX_INIT,Sigma_YY_INIT,REF_LEL_FRAC_ELEM,FRACTURED_DISP_LOAD)
!THIS FUNCTION WILL CALCULATE THE PRESSURE LOAD IN ALL NODE
PRESS_LOAD=(-1.0)*del_T_g*MATMUL(M2_Matr,Prev_P_P)
DISP_LOAD=PORO_DISPL_BNDY_LOAD+FRACTURED_DISP_LOAD
PRINT*,"INSIDE THE GAUSS MODEL BEFORE CALL"
CALL CALC_PORO_SOL_BANDED (nN,refNode,nE,npE,ELEM,BAND_WIDTH,nN_W_B,Wellbore_Boundary_Node,nN_O_B,Outer_Boundary_Node, &
& NO_New_KN_X_Axis_Node,New_KN_X_Axis_Node,nN_Y,Y_axis_Node,Permiab,Mue,del_T_g,CT,Phi,ALPHA,D,Curr_Pw,Prev_S_Prop_Pw,DISP_LOAD,PRESS_LOAD,del_Ux,del_Uy,del_P)
PRINT*,"INSIDE THE GAUSS MODEL AFTER CALL ......."
END SUBROUTINE CALC_DISPLMNT_WITH_GAUSS_PRESS
END MODULE PORO_DISPL_WITH_GAUSS_PRESS
Here is the portion of the main where i called that subroutine in a do loop.
*********************************Main*************************
ITERATIVE: DO WHILE(TOLLARENCE.GE.TOLLARENCE_ACC)
del_T_g=0.1
Tol_Pw_Min_H=1.0-(MinHStr/Curr_Pw)
IF(Tol_Pw_Min_H.LE.0.005) THEN
PRINT*,"FRACTURE PRESSURE IS BELLOW THE MINIMUM IN SITU HORIZONTAL STRESS"
PRINT*," PROPAGATION STOP"
EXIT FRC_ELM
END IF
PRINT*,"BEFORE GAUSS MODEL"
!Curr_Pw=Pw
!THIS SUBROUTINE WILL CALCULATE ALL LOAD AND SOLVED THE DISPLACEMENT AND PRESSURE WITH GAUSS BHP
CALL CALC_DISPLMNT_WITH_GAUSS_PRESS(nN,refNode,nN_W_B,Wellbore_Boundary_Node,n_WB_E, &
& N_TOTAL_FRAC_ELEM,NO_FREE_ELEM,nN_X,FRAC_X_AXIS_NODE,Curr_Pw,Prev_S_Prop_Pw,STEP, &
& Sigma_XX_INIT,Sigma_YY_INIT,REF_LEL_FRAC_ELEM,M2_Matr,Prev_P_P,nE,npE,ELEM,BAND_WIDTH, &
& nN_O_B,Outer_Boundary_Node,NO_New_KN_X_Axis_Node,New_KN_X_Axis_Node,nN_Y,Y_axis_Node, &
& Permiab,Mue,del_T_g,CT,Phi,ALPHA,D,PORO_DISPL_BNDY_LOAD,del_Ux,del_Uy,del_P)
PRINT*,"AFTER GAUSS MODEL"
PRINT*,"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
UX_WITH_G_PRESS=del_Ux+UX_INIT
UY_WITH_G_PRESS=del_Uy+UY_INIT
OPEN(1111, FILE ="PORO_PRESSURE_WITH_FLATP.txt")
WRITE(1111,1)del_P*Pres_SCfactor/PSI_TO_PA
CLOSE(1111)
OPEN(1010, FILE ="PORO_XDIDP_WITH_FLATP.txt")
WRITE(1010,1)UX_WITH_G_PRESS
CLOSE(1010)
!PRINT*,"TEST"
!PAUSE
!WIDTH_WITH_G_PRESS=0.0
DO k=1,nN_X
WIDTH_WITH_G_PRESS(k)=Uy_WITH_G_PRESS(FRAC_X_AXIS_NODE(k))
END DO
!refNode_Upd=0.0
refNode_Upd(:,1)=refNode(:,1)-Ux_WITH_G_PRESS
refNode_Upd(:,2)=refNode(:,2)-Uy_WITH_G_PRESS
!CALL FLUID FLOW INSIDE THE FRACTURE AND DISPLACEMENT CONVERGENCE FOR FRACTURE PRESSURE
PRINT*,"BEFORE EXACT MODEL"
CALL CALC_DISPL_CONV_AND_FRAC_FLUID_FLOW_PORO(nN,refNode,refNode_Upd,NO_New_KN_X_Axis_Node,New_KN_X_Axis_Node, &
& nN_Y,Y_axis_Node,nN_W_B,Wellbore_Boundary_Node,nN_O_B,Outer_Boundary_Node,nE,npE,ELEM,BAND_WIDTH,nN_X, &
& FRAC_X_AXIS_NODE,N_TOTAL_FRAC_ELEM,NO_FREE_ELEM,LEAKOFF_COFF,Meu_FR_F,QRATE,FRAC_WIDTH_PREV,Uy_WITH_G_PRESS, &
& del_T,PREV_NODAL_PRESS_AT_FRAC,CUR_NODAL_PRESS_AT_FRAC,STEP,Sigma_XX_INIT,Sigma_YY_INIT,REF_LEL_FRAC_ELEM, &
& FRACTURED_DISP_LOAD,M2_Matr,Prev_P_P,Permiab,Mue,CT,Phi,ALPHA,D,Curr_Pw,Prev_S_Prop_Pw,PORO_DISPL_BNDY_LOAD,&
& Ux_INIT,Uy_INIT,UX_WITH_EXACT_FRAC_PRESS,Uy_WITH_EXACT_FRAC_PRESS)
PRINT*,"AFTER EXACT MODEL"
DO k=1,nN_X
WIDTH_WITH_EXACT_PRESS(k)=Uy_WITH_EXACT_FRAC_PRESS(FRAC_X_AXIS_NODE(k))
END DO
!AFTER THE DISPLACEMENT CONVERGENCE
!refNode_Upd=0.0
refNode_Upd(:,1)=refNode(:,1)-Ux_WITH_EXACT_FRAC_PRESS
refNode_Upd(:,2)=refNode(:,2)-Uy_WITH_EXACT_FRAC_PRESS
! START THE CONVERGENCE OF CRITICAL WIDTH
UY_FREE_NODE_AT_X(1)=Uy_WITH_EXACT_FRAC_PRESS(REF_LEL_FRAC_ELEM(i,2))
UY_FREE_NODE_AT_X(2)=Uy_WITH_EXACT_FRAC_PRESS(REF_LEL_FRAC_ELEM(i,3))
WIDTH_I_FRAC=ABS(UY_FREE_NODE_AT_X(1)*2.0)
PRINT*,"WIDTH_I_FRAC",WIDTH_I_FRAC
DIFF_WIDTH=ABS(WIDTH_CRIC_FRAC-WIDTH_I_FRAC)
TOLLARENCE=DIFF_WIDTH/WIDTH_CRIC_FRAC
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
IF (TOLLARENCE.GT.TOLLARENCE_ACC) THEN
CALL CRITC_WIDTH_COVG(WIDTH_CRIC_FRAC,WIDTH_I_FRAC,Curr_Pw,MinHStr,G_PRESS,LOOP,FINAL_Pw)
Curr_Pw=FINAL_Pw
FINAL_Pw=0.0
LOOP=LOOP+1
END IF
END DO ITERATIVE ! ITERATION END FOR CRITICAL