1*59599516SKenneth E. Jansenc--------------------------------------------------------------------- 2*59599516SKenneth E. Jansenc 3*59599516SKenneth E. Jansenc drvftools.f : Bundle of Fortran driver routines for ftools.f 4*59599516SKenneth E. Jansenc 5*59599516SKenneth E. Jansenc Each routine is to be called by les**.c 6*59599516SKenneth E. Jansenc 7*59599516SKenneth E. Jansenc--------------------------------------------------------------------- 8*59599516SKenneth E. Jansenc 9*59599516SKenneth E. Jansenc---------------- 10*59599516SKenneth E. Jansenc drvLesPrepDiag 11*59599516SKenneth E. Jansenc---------------- 12*59599516SKenneth E. Jansenc 13*59599516SKenneth E. Jansen subroutine drvlesPrepDiag ( flowDiag, ilwork, 14*59599516SKenneth E. Jansen & iBC, BC, iper, 15*59599516SKenneth E. Jansen & rowp, colm, 16*59599516SKenneth E. Jansen & lhsK, lhsP) 17*59599516SKenneth E. Jansenc 18*59599516SKenneth E. Jansen use pointer_data 19*59599516SKenneth E. Jansen use pvsQbi 20*59599516SKenneth E. Jansen use convolImpFlow !brings in the current part of convol coef for imp BC 21*59599516SKenneth E. Jansen use convolRCRFlow !brings in the current part of convol coef for RCR BC 22*59599516SKenneth E. Jansen 23*59599516SKenneth E. Jansen include "common.h" 24*59599516SKenneth E. Jansen include "mpif.h" 25*59599516SKenneth E. Jansenc 26*59599516SKenneth E. Jansen dimension flowDiag(nshg,4), ilwork(nlwork) 27*59599516SKenneth E. Jansen dimension iBC(nshg), iper(nshg), BC(nshg,ndofBC) 28*59599516SKenneth E. Jansen real*8 lhsK(9,nnz_tot), lhsP(4,nnz_tot) 29*59599516SKenneth E. Jansen integer rowp(nnz_tot), colm(nshg+1) 30*59599516SKenneth E. Jansen integer n, k 31*59599516SKenneth E. Jansenc 32*59599516SKenneth E. Jansen integer sparseloc 33*59599516SKenneth E. Jansenc 34*59599516SKenneth E. Jansenc 35*59599516SKenneth E. Jansenc.... Clear the flowdiag 36*59599516SKenneth E. Jansenc 37*59599516SKenneth E. Jansen if((flmpl.eq.1).or.(ipord.gt.1)) then 38*59599516SKenneth E. Jansen do n = 1, nshg 39*59599516SKenneth E. Jansen k = sparseloc( rowp(colm(n)), colm(n+1)-colm(n), n ) 40*59599516SKenneth E. Jansen & + colm(n)-1 41*59599516SKenneth E. Jansenc 42*59599516SKenneth E. Jansen flowdiag(n,1) = lhsK(1,k) 43*59599516SKenneth E. Jansen flowdiag(n,2) = lhsK(5,k) 44*59599516SKenneth E. Jansen flowdiag(n,3) = lhsK(9,k) 45*59599516SKenneth E. Jansenc 46*59599516SKenneth E. Jansen flowdiag(n,4) = lhsP(4,k) 47*59599516SKenneth E. Jansen enddo 48*59599516SKenneth E. Jansen else 49*59599516SKenneth E. Jansen flowDiag = zero 50*59599516SKenneth E. Jansen do n = 1, nshg ! rowsum put on the diagonal instead of diag entry 51*59599516SKenneth E. Jansen do k=colm(n),colm(n+1)-1 52*59599516SKenneth E. Jansen 53*59599516SKenneth E. Jansenc 54*59599516SKenneth E. Jansen flowdiag(n,1) = flowdiag(n,1) + abs(lhsK(1,k)) 55*59599516SKenneth E. Jansenc & + lhsK(2,k) + lhsK(3,k) 56*59599516SKenneth E. Jansen flowdiag(n,2) = flowdiag(n,2) + abs(lhsK(5,k)) 57*59599516SKenneth E. Jansenc & + lhsK(4,k) + lhsK(6,k) 58*59599516SKenneth E. Jansen flowdiag(n,3) = flowdiag(n,3) + abs(lhsK(9,k)) 59*59599516SKenneth E. Jansenc & + lhsK(7,k) + lhsK(8,k) 60*59599516SKenneth E. Jansenc 61*59599516SKenneth E. Jansen flowdiag(n,4) = flowdiag(n,4) + abs(lhsP(4,k)) 62*59599516SKenneth E. Jansen enddo 63*59599516SKenneth E. Jansen flowdiag(n,:)=flowdiag(n,:)*pt33 64*59599516SKenneth E. Jansen enddo 65*59599516SKenneth E. Jansen endif 66*59599516SKenneth E. Jansen if(ipvsq.ge.3) then ! for first cut only do diagonal extraction 67*59599516SKenneth E. Jansen ! this is not yet correct for multi procs I suspect if partition 68*59599516SKenneth E. Jansen ! boundary cuts a p=QR face 69*59599516SKenneth E. Jansen tfact=alfi * gami * Delt(1) 70*59599516SKenneth E. Jansen do n=1,nshg 71*59599516SKenneth E. Jansen if(numResistSrfs.gt.zero) then 72*59599516SKenneth E. Jansen do k = 1,numResistSrfs 73*59599516SKenneth E. Jansen if (nsrflistResist(k).eq.ndsurf(n)) then 74*59599516SKenneth E. Jansen irankCoupled=k 75*59599516SKenneth E. Jansen flowdiag(n,1:3) = flowdiag(n,1:3) 76*59599516SKenneth E. Jansen & + tfact*ValueListResist(irankCoupled)* 77*59599516SKenneth E. Jansen & NABI(n,:)*NABI(n,:) 78*59599516SKenneth E. Jansen exit 79*59599516SKenneth E. Jansen endif 80*59599516SKenneth E. Jansen enddo 81*59599516SKenneth E. Jansen elseif(numImpSrfs.gt.zero) then 82*59599516SKenneth E. Jansen do k = 1,numImpSrfs 83*59599516SKenneth E. Jansen if (nsrflistImp(k).eq.ndsurf(n)) then 84*59599516SKenneth E. Jansen irankCoupled=k 85*59599516SKenneth E. Jansen flowdiag(n,1:3) = flowdiag(n,1:3) 86*59599516SKenneth E. Jansen & + tfact*ImpConvCoef(ntimeptpT+2,irankCoupled)* 87*59599516SKenneth E. Jansen & NABI(n,:)*NABI(n,:) 88*59599516SKenneth E. Jansen exit 89*59599516SKenneth E. Jansen endif 90*59599516SKenneth E. Jansen enddo 91*59599516SKenneth E. Jansen elseif(numRCRSrfs.gt.zero) then 92*59599516SKenneth E. Jansen do k = 1,numRCRSrfs 93*59599516SKenneth E. Jansen if (nsrflistRCR(k).eq.ndsurf(n)) then 94*59599516SKenneth E. Jansen irankCoupled=k 95*59599516SKenneth E. Jansen flowdiag(n,1:3) = flowdiag(n,1:3) 96*59599516SKenneth E. Jansen & + tfact*RCRConvCoef(lstep+2,irankCoupled)* !check lstep+2 if restart from t.ne.0 97*59599516SKenneth E. Jansen & NABI(n,:)*NABI(n,:) 98*59599516SKenneth E. Jansen exit 99*59599516SKenneth E. Jansen endif 100*59599516SKenneth E. Jansen enddo 101*59599516SKenneth E. Jansen endif 102*59599516SKenneth E. Jansen enddo 103*59599516SKenneth E. Jansen endif 104*59599516SKenneth E. Jansenc 105*59599516SKenneth E. Jansen 106*59599516SKenneth E. Jansenc 107*59599516SKenneth E. Jansen if(iabc==1) !are there any axisym bc's 108*59599516SKenneth E. Jansen & call rotabc(flowdiag, iBC, 'in ') 109*59599516SKenneth E. Jansenc 110*59599516SKenneth E. Jansen 111*59599516SKenneth E. Jansenc 112*59599516SKenneth E. Jansenc.... communicate : add the slaves part to the master's part of flowDiag 113*59599516SKenneth E. Jansenc 114*59599516SKenneth E. Jansen if (numpe > 1) then 115*59599516SKenneth E. Jansen call commu (flowDiag, ilwork, nflow, 'in ') 116*59599516SKenneth E. Jansen endif 117*59599516SKenneth E. Jansenc 118*59599516SKenneth E. Jansenc.... satisfy the boundary conditions on the diagonal 119*59599516SKenneth E. Jansenc 120*59599516SKenneth E. Jansen call bc3diag(iBC, BC, flowDiag) 121*59599516SKenneth E. Jansenc 122*59599516SKenneth E. Jansenc 123*59599516SKenneth E. Jansenc.... on processor periodicity was not taken care of in the setting of the 124*59599516SKenneth E. Jansenc boundary conditions on the matrix. Take care of it now. 125*59599516SKenneth E. Jansenc 126*59599516SKenneth E. Jansen call bc3per(iBC, flowDiag, iper, ilwork, 4) 127*59599516SKenneth E. Jansenc 128*59599516SKenneth E. Jansenc... slaves and masters have the correct values 129*59599516SKenneth E. Jansenc 130*59599516SKenneth E. Jansenc 131*59599516SKenneth E. Jansenc.... Calculate square root 132*59599516SKenneth E. Jansenc 133*59599516SKenneth E. Jansen do i = 1, nshg 134*59599516SKenneth E. Jansen do j = 1, nflow 135*59599516SKenneth E. Jansen if (flowDiag(i,j).ne.0) 136*59599516SKenneth E. Jansen & flowDiag(i,j) = 1. / sqrt(abs(flowDiag(i,j))) 137*59599516SKenneth E. Jansen enddo 138*59599516SKenneth E. Jansen enddo 139*59599516SKenneth E. Jansenc 140*59599516SKenneth E. Jansen return 141*59599516SKenneth E. Jansen end 142*59599516SKenneth E. Jansen 143*59599516SKenneth E. Jansenc 144*59599516SKenneth E. Jansenc------------- 145*59599516SKenneth E. Jansenc drvsclrDiag 146*59599516SKenneth E. Jansenc------------- 147*59599516SKenneth E. Jansenc 148*59599516SKenneth E. Jansen subroutine drvsclrDiag ( sclrDiag, ilwork, iBC, BC, iper, 149*59599516SKenneth E. Jansen & rowp, colm, lhsS ) 150*59599516SKenneth E. Jansenc 151*59599516SKenneth E. Jansen use pointer_data 152*59599516SKenneth E. Jansen include "common.h" 153*59599516SKenneth E. Jansen include "mpif.h" 154*59599516SKenneth E. Jansenc 155*59599516SKenneth E. Jansen integer ilwork(nlwork), iBC(nshg), iper(nshg), 156*59599516SKenneth E. Jansen & rowp(nnz_tot), colm(nshg+1) 157*59599516SKenneth E. Jansen 158*59599516SKenneth E. Jansen real*8 sclrDiag(nshg), lhsS(nnz_tot), BC(nshg,ndofBC) 159*59599516SKenneth E. Jansen integer sparseloc 160*59599516SKenneth E. Jansen 161*59599516SKenneth E. Jansen sclrDiag = zero 162*59599516SKenneth E. Jansen do n = 1, nshg 163*59599516SKenneth E. Jansen k = sparseloc( rowp(colm(n)), colm(n+1)-colm(n), n ) 164*59599516SKenneth E. Jansen & + colm(n)-1 165*59599516SKenneth E. Jansenc 166*59599516SKenneth E. Jansen sclrDiag(n) = lhsS(k) 167*59599516SKenneth E. Jansen enddo 168*59599516SKenneth E. Jansenc 169*59599516SKenneth E. Jansenc.... communicate : add the slaves part to the master's part of sclrDiag 170*59599516SKenneth E. Jansenc 171*59599516SKenneth E. Jansen if (numpe > 1) then 172*59599516SKenneth E. Jansen call commu (sclrDiag, ilwork, 1, 'in ') 173*59599516SKenneth E. Jansen endif 174*59599516SKenneth E. Jansenc 175*59599516SKenneth E. Jansenc.... satisfy the boundary conditions on the diagonal 176*59599516SKenneth E. Jansenc 177*59599516SKenneth E. Jansen call bc3SclrDiag(iBC, sclrDiag) 178*59599516SKenneth E. Jansenc 179*59599516SKenneth E. Jansenc 180*59599516SKenneth E. Jansenc.... on processor periodicity was not taken care of in the setting of the 181*59599516SKenneth E. Jansenc boundary conditions on the matrix. Take care of it now. 182*59599516SKenneth E. Jansenc 183*59599516SKenneth E. Jansen call bc3per(iBC, sclrDiag, iper, ilwork, 1) 184*59599516SKenneth E. Jansenc 185*59599516SKenneth E. Jansenc... slaves and masters have the correct values 186*59599516SKenneth E. Jansenc 187*59599516SKenneth E. Jansenc 188*59599516SKenneth E. Jansenc.... Calculate square root 189*59599516SKenneth E. Jansenc 190*59599516SKenneth E. Jansen do i = 1, nshg 191*59599516SKenneth E. Jansen if (sclrDiag(i).ne.0) then 192*59599516SKenneth E. Jansen sclrDiag(i) = 1. / sqrt(abs(sclrDiag(i))) 193*59599516SKenneth E. Jansen endif 194*59599516SKenneth E. Jansen enddo 195*59599516SKenneth E. Jansenc 196*59599516SKenneth E. Jansen return 197*59599516SKenneth E. Jansen end 198*59599516SKenneth E. Jansen 199*59599516SKenneth E. JansenC============================================================================ 200*59599516SKenneth E. JansenC 201*59599516SKenneth E. JansenC "fLesSparseApG": 202*59599516SKenneth E. JansenC 203*59599516SKenneth E. JansenC============================================================================ 204*59599516SKenneth E. Jansen subroutine fLesSparseApG( col, row, pLhs, 205*59599516SKenneth E. Jansen & p, q, nNodes, 206*59599516SKenneth E. Jansen & nnz_tot ) 207*59599516SKenneth E. Jansenc 208*59599516SKenneth E. Jansenc.... Data declaration 209*59599516SKenneth E. Jansenc 210*59599516SKenneth E. Jansen implicit none 211*59599516SKenneth E. Jansen integer nNodes, nnz_tot 212*59599516SKenneth E. Jansen integer col(nNodes+1), row(nnz_tot) 213*59599516SKenneth E. Jansen real*8 pLhs(4,nnz_tot), p(nNodes), q(nNodes,3) 214*59599516SKenneth E. Jansenc 215*59599516SKenneth E. Jansen real*8 pisave 216*59599516SKenneth E. Jansen integer i, j, k 217*59599516SKenneth E. Jansenc 218*59599516SKenneth E. Jansenc.... clear the vector 219*59599516SKenneth E. Jansenc 220*59599516SKenneth E. Jansen do i = 1, nNodes 221*59599516SKenneth E. Jansen q(i,1) = 0 222*59599516SKenneth E. Jansen q(i,2) = 0 223*59599516SKenneth E. Jansen q(i,3) = 0 224*59599516SKenneth E. Jansen enddo 225*59599516SKenneth E. Jansenc 226*59599516SKenneth E. Jansenc.... Do an AP product 227*59599516SKenneth E. Jansenc 228*59599516SKenneth E. Jansen do i = 1, nNodes 229*59599516SKenneth E. Jansenc 230*59599516SKenneth E. Jansen pisave = p(i) 231*59599516SKenneth E. Jansencdir$ ivdep 232*59599516SKenneth E. Jansen do k = col(i), col(i+1)-1 233*59599516SKenneth E. Jansen j = row(k) 234*59599516SKenneth E. Jansenc 235*59599516SKenneth E. Jansen q(j,1) = q(j,1) - pLhs(1,k) * pisave 236*59599516SKenneth E. Jansen q(j,2) = q(j,2) - pLhs(2,k) * pisave 237*59599516SKenneth E. Jansen q(j,3) = q(j,3) - pLhs(3,k) * pisave 238*59599516SKenneth E. Jansen enddo 239*59599516SKenneth E. Jansen enddo 240*59599516SKenneth E. Jansenc 241*59599516SKenneth E. Jansenc.... end 242*59599516SKenneth E. Jansenc 243*59599516SKenneth E. Jansen return 244*59599516SKenneth E. Jansen end 245*59599516SKenneth E. Jansen 246*59599516SKenneth E. JansenC============================================================================ 247*59599516SKenneth E. JansenC 248*59599516SKenneth E. JansenC "fLesSparseApKG": 249*59599516SKenneth E. JansenC 250*59599516SKenneth E. JansenC============================================================================ 251*59599516SKenneth E. Jansen 252*59599516SKenneth E. Jansen subroutine fLesSparseApKG( col, row, kLhs, pLhs, 253*59599516SKenneth E. Jansen 1 p, q, nNodes, 254*59599516SKenneth E. Jansen 2 nnz_tot_hide ) 255*59599516SKenneth E. Jansenc 256*59599516SKenneth E. Jansenc.... Data declaration 257*59599516SKenneth E. Jansenc 258*59599516SKenneth E. Jansenc implicit none 259*59599516SKenneth E. Jansen use pvsQbi 260*59599516SKenneth E. Jansen include "common.h" 261*59599516SKenneth E. Jansen integer nNodes, nnz_tot 262*59599516SKenneth E. Jansen integer col(nNodes+1), row(nnz_tot) 263*59599516SKenneth E. Jansen real*8 kLhs(9,nnz_tot), pLhs(4,nnz_tot) 264*59599516SKenneth E. Jansen real*8 p(nNodes,4), q(nNodes,3) 265*59599516SKenneth E. Jansenc 266*59599516SKenneth E. Jansen real*8 tmp1, tmp2, tmp3, pisave 267*59599516SKenneth E. Jansen integer i, j, k 268*59599516SKenneth E. Jansenc 269*59599516SKenneth E. Jansenc.... clear the vector 270*59599516SKenneth E. Jansenc 271*59599516SKenneth E. Jansen do i = 1, nNodes 272*59599516SKenneth E. Jansen q(i,1) = 0 273*59599516SKenneth E. Jansen q(i,2) = 0 274*59599516SKenneth E. Jansen q(i,3) = 0 275*59599516SKenneth E. Jansen enddo 276*59599516SKenneth E. Jansenc 277*59599516SKenneth E. Jansenc.... Do an AP product 278*59599516SKenneth E. Jansenc 279*59599516SKenneth E. Jansen do i = 1, nNodes 280*59599516SKenneth E. Jansenc 281*59599516SKenneth E. Jansen tmp1 = 0 282*59599516SKenneth E. Jansen tmp2 = 0 283*59599516SKenneth E. Jansen tmp3 = 0 284*59599516SKenneth E. Jansen pisave = p(i,4) 285*59599516SKenneth E. Jansencdir$ ivdep 286*59599516SKenneth E. Jansen do k = col(i), col(i+1)-1 287*59599516SKenneth E. Jansen j = row(k) 288*59599516SKenneth E. Jansen tmp1 = tmp1 289*59599516SKenneth E. Jansen 1 + kLhs(1,k) * p(j,1) 290*59599516SKenneth E. Jansen 2 + kLhs(4,k) * p(j,2) 291*59599516SKenneth E. Jansen 3 + kLhs(7,k) * p(j,3) 292*59599516SKenneth E. Jansen tmp2 = tmp2 293*59599516SKenneth E. Jansen 1 + kLhs(2,k) * p(j,1) 294*59599516SKenneth E. Jansen 2 + kLhs(5,k) * p(j,2) 295*59599516SKenneth E. Jansen 3 + kLhs(8,k) * p(j,3) 296*59599516SKenneth E. Jansen tmp3 = tmp3 297*59599516SKenneth E. Jansen 1 + kLhs(3,k) * p(j,1) 298*59599516SKenneth E. Jansen 2 + kLhs(6,k) * p(j,2) 299*59599516SKenneth E. Jansen 3 + kLhs(9,k) * p(j,3) 300*59599516SKenneth E. Jansenc 301*59599516SKenneth E. Jansen q(j,1) = q(j,1) - pLhs(1,k) * pisave 302*59599516SKenneth E. Jansen q(j,2) = q(j,2) - pLhs(2,k) * pisave 303*59599516SKenneth E. Jansen q(j,3) = q(j,3) - pLhs(3,k) * pisave 304*59599516SKenneth E. Jansen enddo 305*59599516SKenneth E. Jansen q(i,1) = q(i,1) + tmp1 306*59599516SKenneth E. Jansen q(i,2) = q(i,2) + tmp2 307*59599516SKenneth E. Jansen q(i,3) = q(i,3) + tmp3 308*59599516SKenneth E. Jansen enddo 309*59599516SKenneth E. Jansen 310*59599516SKenneth E. Jansen if(ipvsq.ge.2) then 311*59599516SKenneth E. Jansen tfact=alfi * gami * Delt(1) 312*59599516SKenneth E. Jansen call ElmpvsQ(q,p,tfact) 313*59599516SKenneth E. Jansen endif 314*59599516SKenneth E. Jansenc 315*59599516SKenneth E. Jansenc.... end 316*59599516SKenneth E. Jansenc 317*59599516SKenneth E. Jansen return 318*59599516SKenneth E. Jansen end 319*59599516SKenneth E. Jansen 320*59599516SKenneth E. Jansen 321*59599516SKenneth E. JansenC============================================================================ 322*59599516SKenneth E. JansenC 323*59599516SKenneth E. JansenC "fLesSparseApNGt": 324*59599516SKenneth E. JansenC 325*59599516SKenneth E. JansenC============================================================================ 326*59599516SKenneth E. Jansen 327*59599516SKenneth E. Jansen subroutine fLesSparseApNGt( col, row, pLhs, 328*59599516SKenneth E. Jansen 1 p, q, nNodes, 329*59599516SKenneth E. Jansen 2 nnz_tot ) 330*59599516SKenneth E. Jansenc 331*59599516SKenneth E. Jansenc.... Data declaration 332*59599516SKenneth E. Jansenc 333*59599516SKenneth E. Jansen implicit none 334*59599516SKenneth E. Jansen integer nNodes, nnz_tot 335*59599516SKenneth E. Jansen integer col(nNodes+1), row(nnz_tot) 336*59599516SKenneth E. Jansen real*8 pLhs(4,nnz_tot), p(nNodes,3), q(nNodes) 337*59599516SKenneth E. Jansenc 338*59599516SKenneth E. Jansen real*8 tmp 339*59599516SKenneth E. Jansen integer i, j, k 340*59599516SKenneth E. Jansenc 341*59599516SKenneth E. Jansenc.... Do an AP product 342*59599516SKenneth E. Jansenc 343*59599516SKenneth E. Jansen do i = nNodes, 1, -1 344*59599516SKenneth E. Jansenc 345*59599516SKenneth E. Jansen tmp = 0 346*59599516SKenneth E. Jansen do k = col(i), col(i+1)-1 347*59599516SKenneth E. Jansen j = row(k) 348*59599516SKenneth E. Jansenc 349*59599516SKenneth E. Jansen tmp = tmp 350*59599516SKenneth E. Jansen 1 + pLhs(1,k) * p(j,1) 351*59599516SKenneth E. Jansen 2 + pLhs(2,k) * p(j,2) 352*59599516SKenneth E. Jansen 3 + pLhs(3,k) * p(j,3) 353*59599516SKenneth E. Jansen enddo 354*59599516SKenneth E. Jansen q(i) = tmp 355*59599516SKenneth E. Jansen enddo 356*59599516SKenneth E. Jansenc 357*59599516SKenneth E. Jansenc.... end 358*59599516SKenneth E. Jansenc 359*59599516SKenneth E. Jansen return 360*59599516SKenneth E. Jansen end 361*59599516SKenneth E. Jansen 362*59599516SKenneth E. JansenC============================================================================ 363*59599516SKenneth E. JansenC 364*59599516SKenneth E. JansenC "fLesSparseApNGtC": 365*59599516SKenneth E. JansenC 366*59599516SKenneth E. JansenC============================================================================ 367*59599516SKenneth E. Jansen 368*59599516SKenneth E. Jansen subroutine fLesSparseApNGtC( col, row, pLhs, 369*59599516SKenneth E. Jansen 1 p, q, nNodes, 370*59599516SKenneth E. Jansen 2 nnz_tot ) 371*59599516SKenneth E. Jansenc 372*59599516SKenneth E. Jansenc.... Data declaration 373*59599516SKenneth E. Jansenc 374*59599516SKenneth E. Jansen implicit none 375*59599516SKenneth E. Jansen integer nNodes, nnz_tot 376*59599516SKenneth E. Jansen integer col(nNodes+1), row(nnz_tot) 377*59599516SKenneth E. Jansen real*8 pLhs(4,nnz_tot), p(nNodes,4), q(nNodes) 378*59599516SKenneth E. Jansenc 379*59599516SKenneth E. Jansen real*8 tmp 380*59599516SKenneth E. Jansen integer i, j, k 381*59599516SKenneth E. Jansenc 382*59599516SKenneth E. Jansenc.... Do an AP product 383*59599516SKenneth E. Jansenc 384*59599516SKenneth E. Jansen do i = nNodes, 1, -1 385*59599516SKenneth E. Jansenc 386*59599516SKenneth E. Jansen tmp = 0 387*59599516SKenneth E. Jansen do k = col(i), col(i+1)-1 388*59599516SKenneth E. Jansen j = row(k) 389*59599516SKenneth E. Jansenc 390*59599516SKenneth E. Jansen tmp = tmp 391*59599516SKenneth E. Jansen 1 + pLhs(1,k) * p(j,1) 392*59599516SKenneth E. Jansen 2 + pLhs(2,k) * p(j,2) 393*59599516SKenneth E. Jansen 3 + pLhs(3,k) * p(j,3) 394*59599516SKenneth E. Jansen 4 + pLhs(4,k) * p(j,4) 395*59599516SKenneth E. Jansen enddo 396*59599516SKenneth E. Jansen q(i) = tmp 397*59599516SKenneth E. Jansen enddo 398*59599516SKenneth E. Jansenc 399*59599516SKenneth E. Jansenc.... end 400*59599516SKenneth E. Jansenc 401*59599516SKenneth E. Jansen return 402*59599516SKenneth E. Jansen end 403*59599516SKenneth E. Jansen 404*59599516SKenneth E. JansenC============================================================================ 405*59599516SKenneth E. JansenC 406*59599516SKenneth E. JansenC "fLesSparseApFull": 407*59599516SKenneth E. JansenC 408*59599516SKenneth E. JansenC============================================================================ 409*59599516SKenneth E. Jansen 410*59599516SKenneth E. Jansen subroutine fLesSparseApFull( col, row, kLhs, pLhs, 411*59599516SKenneth E. Jansen 1 p, q, nNodes, 412*59599516SKenneth E. Jansen 2 nnz_tot_hide ) 413*59599516SKenneth E. Jansenc 414*59599516SKenneth E. Jansenc.... Data declaration 415*59599516SKenneth E. Jansenc 416*59599516SKenneth E. Jansenc implicit none 417*59599516SKenneth E. Jansen use pvsQbi 418*59599516SKenneth E. Jansen include "common.h" 419*59599516SKenneth E. Jansen 420*59599516SKenneth E. Jansen integer nNodes, nnz_tot 421*59599516SKenneth E. Jansen integer col(nNodes+1), row(nnz_tot) 422*59599516SKenneth E. Jansen real*8 kLhs(9,nnz_tot), pLhs(4,nnz_tot) 423*59599516SKenneth E. Jansen real*8 p(nNodes,4), q(nNodes,4) 424*59599516SKenneth E. Jansenc 425*59599516SKenneth E. Jansen real*8 tmp1, tmp2, tmp3, tmp4, pisave 426*59599516SKenneth E. Jansen integer i, j, k 427*59599516SKenneth E. Jansenc 428*59599516SKenneth E. Jansenc.... clear the vector 429*59599516SKenneth E. Jansenc 430*59599516SKenneth E. Jansen do i = 1, nNodes 431*59599516SKenneth E. Jansen q(i,1) = 0 432*59599516SKenneth E. Jansen q(i,2) = 0 433*59599516SKenneth E. Jansen q(i,3) = 0 434*59599516SKenneth E. Jansen enddo 435*59599516SKenneth E. Jansenc 436*59599516SKenneth E. Jansenc.... Do an AP product 437*59599516SKenneth E. Jansenc 438*59599516SKenneth E. Jansen do i = 1, nNodes 439*59599516SKenneth E. Jansenc 440*59599516SKenneth E. Jansen tmp1 = 0 441*59599516SKenneth E. Jansen tmp2 = 0 442*59599516SKenneth E. Jansen tmp3 = 0 443*59599516SKenneth E. Jansen tmp4 = 0 444*59599516SKenneth E. Jansen pisave = p(i,4) 445*59599516SKenneth E. Jansencdir$ ivdep 446*59599516SKenneth E. Jansen do k = col(i), col(i+1)-1 447*59599516SKenneth E. Jansen j = row(k) 448*59599516SKenneth E. Jansenc 449*59599516SKenneth E. Jansen tmp1 = tmp1 450*59599516SKenneth E. Jansen 1 + kLhs(1,k) * p(j,1) 451*59599516SKenneth E. Jansen 2 + kLhs(4,k) * p(j,2) 452*59599516SKenneth E. Jansen 3 + kLhs(7,k) * p(j,3) 453*59599516SKenneth E. Jansen tmp2 = tmp2 454*59599516SKenneth E. Jansen 1 + kLhs(2,k) * p(j,1) 455*59599516SKenneth E. Jansen 2 + kLhs(5,k) * p(j,2) 456*59599516SKenneth E. Jansen 3 + kLhs(8,k) * p(j,3) 457*59599516SKenneth E. Jansen tmp3 = tmp3 458*59599516SKenneth E. Jansen 1 + kLhs(3,k) * p(j,1) 459*59599516SKenneth E. Jansen 2 + kLhs(6,k) * p(j,2) 460*59599516SKenneth E. Jansen 3 + kLhs(9,k) * p(j,3) 461*59599516SKenneth E. Jansenc 462*59599516SKenneth E. Jansen tmp4 = tmp4 463*59599516SKenneth E. Jansen 1 + pLhs(1,k) * p(j,1) 464*59599516SKenneth E. Jansen 2 + pLhs(2,k) * p(j,2) 465*59599516SKenneth E. Jansen 3 + pLhs(3,k) * p(j,3) 466*59599516SKenneth E. Jansen 4 + pLhs(4,k) * p(j,4) 467*59599516SKenneth E. Jansenc 468*59599516SKenneth E. Jansen q(j,1) = q(j,1) - pLhs(1,k) * pisave 469*59599516SKenneth E. Jansen q(j,2) = q(j,2) - pLhs(2,k) * pisave 470*59599516SKenneth E. Jansen q(j,3) = q(j,3) - pLhs(3,k) * pisave 471*59599516SKenneth E. Jansen enddo 472*59599516SKenneth E. Jansen q(i,1) = q(i,1) + tmp1 473*59599516SKenneth E. Jansen q(i,2) = q(i,2) + tmp2 474*59599516SKenneth E. Jansen q(i,3) = q(i,3) + tmp3 475*59599516SKenneth E. Jansen q(i,4) = tmp4 476*59599516SKenneth E. Jansen enddo 477*59599516SKenneth E. Jansen if(ipvsq.ge.2) then 478*59599516SKenneth E. Jansen tfact=alfi * gami * Delt(1) 479*59599516SKenneth E. Jansen call ElmpvsQ(q,p,tfact) 480*59599516SKenneth E. Jansen endif 481*59599516SKenneth E. Jansenc 482*59599516SKenneth E. Jansenc.... end 483*59599516SKenneth E. Jansenc 484*59599516SKenneth E. Jansen return 485*59599516SKenneth E. Jansen end 486*59599516SKenneth E. Jansen 487*59599516SKenneth E. JansenC============================================================================ 488*59599516SKenneth E. JansenC 489*59599516SKenneth E. JansenC "fLesSparseApSclr": 490*59599516SKenneth E. JansenC 491*59599516SKenneth E. JansenC============================================================================ 492*59599516SKenneth E. Jansen 493*59599516SKenneth E. Jansen subroutine fLesSparseApSclr( col, row, lhs, 494*59599516SKenneth E. Jansen 1 p, q, nNodes, 495*59599516SKenneth E. Jansen & nnz_tot) 496*59599516SKenneth E. Jansenc 497*59599516SKenneth E. Jansenc.... Data declaration 498*59599516SKenneth E. Jansenc 499*59599516SKenneth E. Jansen implicit none 500*59599516SKenneth E. Jansen integer nNodes, nnz_tot 501*59599516SKenneth E. Jansen integer col(nNodes+1), row(nnz_tot) 502*59599516SKenneth E. Jansen real*8 lhs(nnz_tot), p(nNodes), q(nNodes) 503*59599516SKenneth E. Jansenc 504*59599516SKenneth E. Jansen real*8 tmp 505*59599516SKenneth E. Jansen integer i, j, k 506*59599516SKenneth E. Jansenc 507*59599516SKenneth E. Jansenc.... Do an AP product 508*59599516SKenneth E. Jansenc 509*59599516SKenneth E. Jansen do i = nNodes, 1, -1 510*59599516SKenneth E. Jansenc 511*59599516SKenneth E. Jansen tmp = 0 512*59599516SKenneth E. Jansen do k = col(i), col(i+1)-1 513*59599516SKenneth E. Jansen tmp = tmp + lhs(k) * p(row(k)) 514*59599516SKenneth E. Jansen enddo 515*59599516SKenneth E. Jansen q(i) = tmp 516*59599516SKenneth E. Jansen enddo 517*59599516SKenneth E. Jansenc 518*59599516SKenneth E. Jansenc.... end 519*59599516SKenneth E. Jansenc 520*59599516SKenneth E. Jansen return 521*59599516SKenneth E. Jansen end 522*59599516SKenneth E. Jansen 523*59599516SKenneth E. JansenC============================================================================ 524*59599516SKenneth E. Jansen subroutine commOut( global, ilwork, n, 525*59599516SKenneth E. Jansen & iper, iBC, BC ) 526*59599516SKenneth E. Jansen 527*59599516SKenneth E. Jansen include "common.h" 528*59599516SKenneth E. Jansen 529*59599516SKenneth E. Jansen real*8 global(nshg,n), BC(nshg,ndofBC) 530*59599516SKenneth E. Jansen integer ilwork(nlwork), iper(nshg), iBC(nshg) 531*59599516SKenneth E. Jansenc 532*59599516SKenneth E. Jansen if ( numpe .gt. 1) then 533*59599516SKenneth E. Jansen call commu ( global, ilwork, n, 'out') 534*59599516SKenneth E. Jansen endif 535*59599516SKenneth E. Jansenc 536*59599516SKenneth E. Jansenc before doing AP product P must be made periodic 537*59599516SKenneth E. Jansenc on processor slaves did not get updated with the 538*59599516SKenneth E. Jansenc commu (out) so do it here 539*59599516SKenneth E. Jansenc 540*59599516SKenneth E. Jansen do i=1,n 541*59599516SKenneth E. Jansen global(:,i) = global(iper(:),i) ! iper(i)=i if non-slave so no danger 542*59599516SKenneth E. Jansen enddo 543*59599516SKenneth E. Jansenc 544*59599516SKenneth E. Jansenc slave has masters value, for abc we need to rotate it 545*59599516SKenneth E. Jansenc (if this is a vector only no SCALARS) 546*59599516SKenneth E. Jansen if((iabc==1) .and. (n.gt.1)) !are there any axisym bc's 547*59599516SKenneth E. Jansen & call rotabc(global, iBC, 'out') 548*59599516SKenneth E. Jansen 549*59599516SKenneth E. Jansen 550*59599516SKenneth E. Jansenc$$$ do j = 1,nshg 551*59599516SKenneth E. Jansenc$$$ if (btest(iBC(j),10)) then 552*59599516SKenneth E. Jansenc$$$ i = iper(j) 553*59599516SKenneth E. Jansenc$$$ res(j,:) = res(i,:) 554*59599516SKenneth E. Jansenc$$$ endif 555*59599516SKenneth E. Jansenc$$$ enddo 556*59599516SKenneth E. Jansen 557*59599516SKenneth E. Jansen return 558*59599516SKenneth E. Jansen end 559*59599516SKenneth E. Jansen 560*59599516SKenneth E. JansenC============================================================================ 561*59599516SKenneth E. Jansen subroutine commIn( global, ilwork, n, 562*59599516SKenneth E. Jansen & iper, iBC, BC ) 563*59599516SKenneth E. Jansen 564*59599516SKenneth E. Jansen include "common.h" 565*59599516SKenneth E. Jansen 566*59599516SKenneth E. Jansen real*8 global(nshg,n), BC(nshg,ndofBC) 567*59599516SKenneth E. Jansen integer ilwork(nlwork), iper(nshg), iBC(nshg) 568*59599516SKenneth E. Jansenc 569*59599516SKenneth E. Jansen if((iabc==1) .and. (n.gt.1)) !are there any axisym bc's 570*59599516SKenneth E. Jansen & call rotabc(global, iBC, 'in ') 571*59599516SKenneth E. Jansenc 572*59599516SKenneth E. Jansen 573*59599516SKenneth E. Jansen if ( numpe .gt. 1 ) then 574*59599516SKenneth E. Jansen call commu ( global, ilwork, n, 'in ') 575*59599516SKenneth E. Jansen endif 576*59599516SKenneth E. Jansen 577*59599516SKenneth E. Jansen call bc3per ( iBC, global, iper, ilwork, n) 578*59599516SKenneth E. Jansen 579*59599516SKenneth E. Jansen return 580*59599516SKenneth E. Jansen end 581*59599516SKenneth E. Jansen 582