247
248
249
251
252
253
254#include "implicit_f.inc"
255
256
257
258#include "sphcom.inc"
259
260
261
262 INTEGER, INTENT(INOUT) :: LFT
263 INTEGER, INTENT(INOUT) :: LLT
264 INTEGER, INTENT(INOUT) :: NFT
265 INTEGER KXSP(NISP,*),IXSP(KVOISPH,*),NOD2SP(*),
266 . ISPSYM(NSPCOND,*)
268 . x(3,*) ,ms(*) ,
269 . spbuf(nspbuf,*) ,xspsym(3,*) ,
270 . wa(kwasph,*) ,wacomp(16,*),
271 . wgradt(3,*),wgr(3,*),wgradtsm(3,*),
272 . wlaplt(*),wsmcomp(6,*),lambda(*),lambdr(*)
273
274
275
276 INTEGER I,N,INOD,JNOD,J,,M,
277 . NVOISS,SM,JS,NC,NS,NN
279 . xi,yi,zi,di,rhoi,xj,yj,zj,dj,rhoj,dij,
280 . vj,wght,wgrad(3),
281 . alphai,alphaxi,alphayi,alphazi,
282 . betaxi,betayi,betazi,
283 . betaxxi,betayxi,betazxi,
284 . betaxyi,betayyi,betazyi,
285 . betaxzi,betayzi,betazzi,
286 . alphaj,alphaxj,alphayj,alphazj,
287 . betaxj,betayj,betazj,
288 . betaxxj,betayxj,betazxj,
289 . betaxyj,betayyj,betazyj,
290 . betaxzj,betayzj,betazzj,
291 . betax,wgrdx,wgrdy,wgrdz,wgrd(3),
292 . gradtxi,gradtyi,gradtzi,
293 . gradtxj,gradtyj,gradtzj
294
295 DO i=lft,llt
296 n =nft+i
297 wlaplt(n)=zero
298 ENDDO
299
300
301
302 DO 10 i=lft,llt
303 n =nft+i
304 IF(kxsp(2,n)<=0)GOTO 10
305 inod =kxsp(3,n)
306 xi=x(1,inod)
307 yi=x(2,inod)
308 zi=x(3,inod)
309 di=spbuf(1,n)
310 gradtxi=wgradt(1,n)
311 gradtyi=wgradt(2,n)
312 gradtzi=wgradt(3,n)
313 rhoi =wa(10,n)
314
315 alphai=wacomp(1,n)
316
317
318
319 alphaxi=wacomp( 5,n)
320 alphayi=wacomp( 6,n)
321 alphazi=wacomp( 7,n)
322 betaxxi=wacomp( 8,n)
323 betayxi=wacomp( 9,n)
324 betazxi=wacomp(10,n)
325 betaxyi=wacomp(11,n)
326 betayyi=wacomp(12,n)
327 betazyi=wacomp(13,n)
328 betaxzi=wacomp(14,n)
329 betayzi=wacomp(15,n)
330 betazzi=wacomp(16,n)
331
332 nvois=kxsp(4,n)
333 DO j=1,nvois
334 jnod=ixsp(j,n)
335 IF(jnod>0)THEN
336 m=nod2sp(jnod)
337 xj=x(1,jnod)
338 yj=x(2,jnod)
339 zj=x(3,jnod)
340 dj=spbuf(1,m)
341 dij=0.5*(di+dj)
342 CALL weight1(xi,yi,zi,xj,yj,zj,dij,wght,wgrad)
343 rhoj=wa(10,m)
344 vj=spbuf(12,m)/
max(em20,rhoj)
345 gradtxj=wgradt(1,m)
346 gradtyj=wgradt(2,m)
347 gradtzj=wgradt(3,m)
348 wgrdx=wgrad(1)
349 wgrdy=wgrad(2)
350 wgrdz=wgrad(3)
351 wgrad(1)=wgrdx*alphai+wght*alphaxi
352 . +wgrdx*betaxxi+wgrdy*betaxyi+wgrdz*betaxzi
353 wgrad(2)=wgrdy*alphai+wght*alphayi
354 . +wgrdx*betayxi+wgrdy*betayyi+wgrdz*betayzi
355 wgrad(3)=wgrdz*alphai+wght*alphazi
356 . +wgrdx*betazxi+wgrdy*betazyi+wgrdz*betazzi
357
358
359
360
361
362
363
364
365
366
367
368
369
370 alphaj=wacomp(1,m)
371
372
373
374 alphaxj=wacomp( 5,m)
375 alphayj=wacomp( 6,m)
376 alphazj=wacomp( 7,m)
377 betaxxj=wacomp( 8,m)
378 betayxj=wacomp( 9,m)
379 betazxj=wacomp(10,m)
380 betaxyj=wacomp(11,m)
381 betayyj=wacomp(12,m)
382 betazyj=wacomp(13,m)
383 betaxzj=wacomp(14,m)
384 betayzj=wacomp(15,m)
385 betazzj=wacomp(16,m)
386
387 wgrd(1)=-wgrdx*alphaj+wght*alphaxj
388 . -wgrdx*betaxxj-wgrdy*betaxyj-wgrdz*betaxzj
389 wgrd(2)=-wgrdy*alphaj+wght*alphayj
390 . -wgrdx*betayxj-wgrdy*betayyj-wgrdz*betayzj
391 wgrd(3)=-wgrdz*alphaj+wght*alphazj
392 . -wgrdx*betazxj-wgrdy*betazyj-wgrdz*betazzj
393
394
395
396
397
398
399
400
401
402
403
404
405 wlaplt(n)=wlaplt(n)+vj*(
406 . -lambda(m)*(gradtxj*wgrd(1)+gradtyj*wgrd(2)+gradtzj*wgrd(3))
407 . +lambda(n)*(gradtxi*wgrad(1)+gradtyi*wgrad(2)+gradtzi*wgrad(3)))
408
409 ELSE
410 nn = -jnod
411 xj=xsphr(3,nn)
412 yj=xsphr(4,nn)
413 zj=xsphr(5,nn)
414 dj=xsphr(2,nn)
415 dij=0.5*(di+dj)
416 CALL weight1(xi,yi,zi,xj,yj,zj,dij,wght,wgrad)
417 rhoj=xsphr(7,nn)
418 vj=xsphr(8,nn)/
max(em20,rhoj)
419 gradtxj=wgr(1,nn)
420 gradtyj=wgr(2,nn)
421 gradtzj=wgr(3,nn)
422 wgrdx=wgrad(1)
423 wgrdy=wgrad(2)
424 wgrdz=wgrad(3)
425 wgrad(1)=wgrdx*alphai+wght*alphaxi
426 . +wgrdx*betaxxi+wgrdy*betaxyi+wgrdz*betaxzi
427 wgrad(2)=wgrdy*alphai+wght*alphayi
428 . +wgrdx*betayxi+wgrdy*betayyi+wgrdz*betayzi
429 wgrad(3)=wgrdz*alphai+wght*alphazi
430 . +wgrdx*betazxi+wgrdy*betazyi+wgrdz*betazzi
431
432
433
434
435
436
437
438
439
440
441
442
443
444 alphaj=wacompr(1,nn)
445
446
447
448 alphaxj=wacompr( 5,nn)
449 alphayj=wacompr( 6,nn)
450 alphazj=wacompr( 7,nn)
451 betaxxj=wacompr( 8,nn)
452 betayxj=wacompr( 9,nn)
453 betazxj=wacompr(10,nn)
454 betaxyj=wacompr(11,nn)
455 betayyj=wacompr(12,nn)
456 betazyj=wacompr(13,nn)
457 betaxzj=wacompr(14,nn)
458 betayzj=wacompr(15,nn)
459 betazzj=wacompr(16,nn)
460
461 wgrd(1)=-wgrdx*alphaj+wght*alphaxj
462 . -wgrdx*betaxxj-wgrdy*betaxyj-wgrdz*betaxzj
463 wgrd(2)=-wgrdy*alphaj+wght*alphayj
464 . -wgrdx*betayxj-wgrdy*betayyj-wgrdz*betayzj
465 wgrd(3)=-wgrdz*alphaj+wght*alphazj
466 . -wgrdx*betazxj-wgrdy*betazyj-wgrdz*betazzj
467
468
469
470
471! . (betaxxj*(xj-xi)+betayxj*(yj-yi)+betazxj*(zj-zi)+betaxj))
472
473
474
475
476
477! . (betaxzj*(xj-xi)+betayzj*(yj-yi)+betazzj*(zj-zi)+betazj))
478
479 wlaplt(n)=wlaplt(n)+vj*(
480 . -lambdr(nn)*(gradtxj*wgrd(1)+gradtyj*wgrd(2)+gradtzj*wgrd(3))
481 . +lambda(n)*(gradtxi*wgrad(1)+gradtyi*wgrad(2)+gradtzi*wgrad(3)))
482 END IF
483
484 END DO
485
486
487 nvoiss=kxsp(6,n)
488 DO j=kxsp(5,n)+1,kxsp(5,n)+nvoiss
489 js=ixsp(j,n)
490 IF(js>0)THEN
491 sm=js/(nspcond+1)
492 nc=mod(js,nspcond+1)
493 js=ispsym(nc,sm)
494 xj =xspsym(1,js)
495 yj =xspsym(2,js)
496 zj =xspsym(3,js)
497 dj =spbuf(1,sm)
498 dij =half*(di+dj)
499 rhoj=wa(10,sm)
500 CALL weight1(xi,yi,zi,xj,yj,zj,dij,wght,wgrad)
501 jnod=kxsp(3,sm)
502 vj=spbuf(12,sm)/
max(em20,rhoj)
503 gradtxj=wgradtsm(1,js)
504 gradtyj=wgradtsm(2,js)
505 gradtzj=wgradtsm(3,js)
506 wgrdx=wgrad(1)
507 wgrdy=wgrad(2)
508 wgrdz=wgrad(3)
509 wgrad(1)=wgrdx*alphai+wght*alphaxi
510 . +wgrdx*betaxxi+wgrdy*betaxyi+wgrdz*betaxzi
511 wgrad(2)=wgrdy*alphai+wght*alphayi
512 . +wgrdx*betayxi+wgrdy*betayyi+wgrdz*betayzi
513 wgrad(3)=wgrdz*alphai+wght*alphazi
514 . +wgrdx*betazxi+wgrdy*betazyi+wgrdz*betazzi
515
516
517
518
519
520
521
522! . (betaxyi*(xi-xj)+betayyi*(yi-yj)+betazyi*(zi-zj)+betayi))
523
524
525! . (betaxzi*(xi-xj)+betayzi*(yi-yj)+betazzi*(zi-zj)+betazi))
526
527
528 alphaj=wacomp(1,sm)
529
530
531
532 alphaxj=wsmcomp( 4,js)
533 alphayj=wsmcomp( 5,js)
534 alphazj=wsmcomp( 6,js)
535 betaxxj=wacomp( 8,sm)
536 betayxj=wacomp( 9,sm)
537 betazxj=wacomp(10,sm)
538 betaxyj=wacomp(11,sm)
539 betayyj=wacomp(12,sm)
540 betazyj=wacomp(13,sm)
541 betaxzj=wacomp(14,sm)
542 betayzj=wacomp(15,sm)
543 betazzj=wacomp(16,sm)
544
545 wgrd(1)=-wgrdx*alphaj+wght*alphaxj
546 . -wgrdx*betaxxj-wgrdy*betaxyj-wgrdz*betaxzj
547 wgrd(2)=-wgrdy*alphaj+wght*alphayj
548 . -wgrdx*betayxj-wgrdy*betayyj-wgrdz*betayzj
549 wgrd(3)=-wgrdz*alphaj+wght*alphazj
550 . -wgrdx*betazxj-wgrdy*betazyj-wgrdz*betazzj
551
552
553
554
555
556
557
558
559
560
561
562
563 wlaplt(n)=wlaplt(n)+vj*(
564 . -lambda(sm)*(gradtxj*wgrd(1)+gradtyj*wgrd(2)+gradtzj*wgrd(3))
565 . +lambda(n)*(gradtxi*wgrad(1)+gradtyi*wgrad(2)+gradtzi*wgrad(3)))
566 ELSE
567 sm=-js/(nspcond+1)
568 nc=mod(-js,nspcond+1)
570 xj =xspsym(1,js)
571 yj =xspsym(2,js)
572 zj =xspsym(3,js)
573 dj =xsphr(2,sm)
574 dij =half*(di+dj)
575 rhoj=xsphr(7,sm)
576 CALL weight1(xi,yi,zi,xj,yj,zj,dij,wght,wgrad)
577 jnod=kxsp(3,sm)
578 vj=xsphr(8,sm)/
max(em20,rhoj)
579 gradtxj=wgradtsm(1,js)
580 gradtyj=wgradtsm(2,js)
581 gradtzj=wgradtsm(3,js)
582
583 wgrdx=wgrad(1)
584 wgrdy=wgrad(2)
585 wgrdz=wgrad(3)
586 wgrad(1)=wgrdx*alphai+wght*alphaxi
587 . +wgrdx*betaxxi+wgrdy*betaxyi+wgrdz*betaxzi
588 wgrad(2)=wgrdy*alphai+wght*alphayi
589 . +wgrdx*betayxi+wgrdy*betayyi+wgrdz*betayzi
590 wgrad(3)=wgrdz*alphai+wght*alphazi
591 . +wgrdx*betazxi+wgrdy*betazyi+wgrdz*betazzi
592! old order1 correction
593
594! wgrad(1)=wgrdx*alphai*betax
595
596
597
598
599
600
601
602
603
604
605 alphaj=wacompr(1,sm)
606
607
608
609 alphaxj=wsmcomp( 4,js)
610 alphayj=wsmcomp( 5,js)
611 alphazj=wsmcomp( 6,js)
612 betaxxj=wacompr( 8,sm)
613 betayxj=wacompr( 9,sm)
614 betazxj=wacompr(10,sm)
615 betaxyj=wacompr(11,sm)
616 betayyj=wacompr(12,sm)
617 betazyj=wacompr(13,sm)
618 betaxzj=wacompr(14,sm)
619 betayzj=wacompr(15,sm)
620 betazzj=wacompr(16,sm)
621
622 wgrd(1)=-wgrdx*alphaj+wght*alphaxj
623 . -wgrdx*betaxxj-wgrdy*betaxyj-wgrdz*betaxzj
624 wgrd(2)=-wgrdy*alphaj+wght*alphayj
625 . -wgrdx*betayxj-wgrdy*betayyj-wgrdz*betayzj
626 wgrd(3)=-wgrdz*alphaj+wght*alphazj
627 . -wgrdx*betazxj-wgrdy*betazyj-wgrdz*betazzj
628
629! betax=one +betaxj*(xj-xi)+betayj*(yj-yi)+betazj*(zj-zi)
630
631
632
633
634
635! . (betaxyj*(xj-xi)+betayyj*(yj-yi)+betazyj*(zj-zi)+betayj))
636
637
638
639
640 wlaplt(n)=wlaplt(n)+vj*(
641 . -lambdr(sm)*(gradtxj*wgrd(1)+gradtyj*wgrd(2)+gradtzj*wgrd(3))
642 . +lambda(n)*(gradtxi*wgrad(1)+gradtyi*wgrad(2)+gradtzi*wgrad(3)))
643 END IF
644 END DO
645
646 10 CONTINUE
647
648 RETURN