5 &(op , dm,typdim,xm,typexm, dn,typdin,xn,typexn, d,c,
6 & ikle,nelem,nelmax,ndiag,stox)
134 INTEGER,
INTENT(IN) :: NELEM,NELMAX,NDIAG,STOX
135 INTEGER,
INTENT(IN) :: IKLE(nelmax,6)
136 CHARACTER(LEN=8),
INTENT(IN) :: OP
137 DOUBLE PRECISION,
INTENT(IN) :: DN(*),D(*),XN(nelmax,*)
138 DOUBLE PRECISION,
INTENT(INOUT) :: DM(*),XM(nelmax,*)
139 CHARACTER(LEN=1),
INTENT(INOUT) :: TYPDIM,TYPEXM,TYPDIN,TYPEXN
140 DOUBLE PRECISION,
INTENT(IN) :: C
144 INTEGER I,J,IELEM,I1,I2,I3,I4,I5,I6
150 IF(stox.EQ.2.AND.op(3:8).NE.
'N ')
THEN 151 WRITE(
lu,*)
'OM4141 (BIEF): OFF-DIAGONAL STORAGE 2' 152 WRITE(
lu,*)
' NOT IMPLEMENTED' 153 WRITE(
lu,*)
' WITH OPERATION ',op
160 IF(op(3:8).EQ.
'N ')
THEN 162 IF(typdin(1:1).EQ.
'Q')
THEN 163 CALL ov(
'X=Y ', x=dm, y=dn, dim1=ndiag)
164 ELSEIF(typdin(1:1).EQ.
'I'.OR.typdin(1:1).EQ.
'0')
THEN 167 WRITE(
lu,6) typdin(1:1)
168 6
FORMAT(1x,
'OM4141 (BIEF) : TYPDIN UNKNOWN :',a1)
172 typdim(1:1)=typdin(1:1)
174 IF(typexn(1:1).EQ.
'S')
THEN 178 CALL ov(
'X=Y ', x=xm, y=xn, dim1=15*nelmax)
181 CALL ov(
'X=Y ', x=xm(1,i), y=xn(1,i), dim1=nelem)
184 ELSEIF(typexn(1:1).EQ.
'Q')
THEN 188 CALL ov(
'X=Y ' , x=xm, y=xn, dim1=30*nelmax)
191 CALL ov(
'X=Y ' , x=xm(1,i), y=xn(1,i), dim1=nelem)
194 ELSEIF(typexn(1:1).NE.
'0')
THEN 195 WRITE(
lu,11) typexn(1:1)
196 11
FORMAT(1x,
'OM4141 (BIEF) : TYPEXN UNKNOWN :',a1)
201 typexm(1:1)=typexn(1:1)
205 ELSEIF(op(3:8).EQ.
'TN ')
THEN 207 CALL ov(
'X=Y ', x=dm, y=dn, dim1=ndiag)
209 IF(typexn(1:1).EQ.
'S')
THEN 211 CALL ov(
'X=Y ', x=xm(1,i), y=xn(1,i), dim1=nelem)
213 ELSEIF(typexn(1:1).EQ.
'Q')
THEN 215 CALL ov(
'X=Y ', x=xm(1,i), y=xn(1,i+15), dim1=nelem)
216 CALL ov(
'X=Y ', x=xm(1,i+15), y=xn(1,i), dim1=nelem)
218 ELSEIF(typexn(1:1).NE.
'0')
THEN 219 WRITE(
lu,11) typexn(1:1)
224 typdim(1:1)=typdin(1:1)
225 typexm(1:1)=typexn(1:1)
229 ELSEIF(op(3:8).EQ.
'CN ')
THEN 231 CALL ov(
'X=CY ', x=dm, y=dn, c=c, dim1=ndiag)
233 IF(typexn(1:1).EQ.
'S')
THEN 235 CALL ov(
'X=CY ', x=xm(1,i), y=xn(1,i), c=c, dim1=nelem)
237 ELSEIF(typexn(1:1).EQ.
'Q')
THEN 239 CALL ov(
'X=CY ', x=xm(1,i), y=xn(1,i), c=c, dim1=nelem)
241 ELSEIF(typexn(1:1).NE.
'0')
THEN 242 WRITE(
lu,11) typexn(1:1)
247 typdim(1:1)=typdin(1:1)
248 typexm(1:1)=typexn(1:1)
252 ELSEIF(op(3:8).EQ.
'CM ')
THEN 254 CALL ov(
'X=CX ', x=dm, c=c, dim1=ndiag)
256 IF(typexm(1:1).EQ.
'S')
THEN 258 CALL ov(
'X=CX ', x=xm(1,i),c=c, dim1=nelem)
260 ELSEIF(typexm(1:1).EQ.
'Q')
THEN 262 CALL ov(
'X=CX ', x=xm(1,i),c=c, dim1=nelem)
264 ELSEIF(typexm(1:1).NE.
'0')
THEN 265 WRITE(
lu,11) typexm(1:1)
272 ELSEIF(op(3:8).EQ.
'M+CN ')
THEN 274 IF(typdin(1:1).EQ.
'I')
THEN 275 CALL ov(
'X=X+C ', x=dm, c=c, dim1=ndiag)
276 ELSEIF(typdin(1:1).NE.
'0')
THEN 277 CALL ov(
'X=X+CY ', x=dm, y=dn, c=c, dim1=ndiag)
280 IF(typexn(1:1).EQ.
'S')
THEN 282 CALL ov(
'X=X+CY ', x=xm(1,i), y=xn(1,i), c=c, dim1=nelem)
284 IF(typexm(1:1).EQ.
'Q')
THEN 286 CALL ov(
'X=X+CY ', x=xm(1,i+15), y=xn(1,i),
290 ELSEIF(typexn(1:1).EQ.
'Q')
THEN 291 IF(typexm(1:1).NE.
'Q')
THEN 292 WRITE(
lu,98) typexm(1:1),op(1:8),typexn(1:1)
293 98
FORMAT(1x,
'OM4141 (BIEF) : TYPEXM = ',a1,
' DOES NOT GO',
294 & /,1x,
'FOR THE OPERATION : ',a8,
' WITH TYPEXN = ',a1)
299 CALL ov(
'X=X+CY ', x=xm(1,i), y=xn(1,i), c=c, dim1=nelem)
301 ELSEIF(typexn(1:1).NE.
'0')
THEN 302 WRITE(
lu,11) typexn(1:1)
309 ELSEIF(op(3:8).EQ.
'M+N '.OR.
310 & (op(3:8).EQ.
'M+TN ').AND.typexn(1:1).NE.
'Q')
THEN 312 CALL ov(
'X=X+Y ', x=dm, y=dn, dim1=ndiag)
314 IF(typexn(1:1).EQ.
'S')
THEN 316 CALL ov(
'X=X+Y ', x=xm(1,i), y=xn(1,i), dim1=nelem)
318 IF(typexm(1:1).EQ.
'Q')
THEN 320 CALL ov(
'X=X+Y ', x=xm(1,i+15), y=xn(1,i), dim1=nelem)
323 ELSEIF(typexn(1:1).EQ.
'Q')
THEN 324 IF(typexm(1:1).NE.
'Q')
THEN 325 WRITE(
lu,98) typexm(1:1),op(1:8),typexn(1:1)
330 CALL ov(
'X=X+Y ', x=xm(1,i), y=xn(1,i), dim1=nelem)
332 ELSEIF(typexn(1:1).NE.
'0')
THEN 333 WRITE(
lu,11) typexn(1:1)
340 ELSEIF(op(3:8).EQ.
'MD ')
THEN 344 IF(typdim(1:1).EQ.
'Q')
THEN 345 CALL ov(
'X=XY ', x=dm, y=d, dim1=ndiag)
346 ELSEIF(typdim(1:1).EQ.
'I')
THEN 347 CALL ov(
'X=Y ', x=dm, y=d, dim1=ndiag)
349 ELSEIF(typdim(1:1).NE.
'0')
THEN 350 WRITE(
lu,13) typdim(1:1)
357 IF(typexm(1:1).EQ.
'Q')
THEN 361 xm(ielem, 1) = xm(ielem, 1) * d(ikle(ielem,2))
362 xm(ielem, 2) = xm(ielem, 2) * d(ikle(ielem,3))
363 xm(ielem, 3) = xm(ielem, 3) * d(ikle(ielem,4))
364 xm(ielem, 4) = xm(ielem, 4) * d(ikle(ielem,5))
365 xm(ielem, 5) = xm(ielem, 5) * d(ikle(ielem,6))
366 xm(ielem, 6) = xm(ielem, 6) * d(ikle(ielem,3))
367 xm(ielem, 7) = xm(ielem, 7) * d(ikle(ielem,4))
368 xm(ielem, 8) = xm(ielem, 8) * d(ikle(ielem,5))
369 xm(ielem, 9) = xm(ielem, 9) * d(ikle(ielem,6))
370 xm(ielem,10) = xm(ielem,10) * d(ikle(ielem,4))
371 xm(ielem,11) = xm(ielem,11) * d(ikle(ielem,5))
372 xm(ielem,12) = xm(ielem,12) * d(ikle(ielem,6))
373 xm(ielem,13) = xm(ielem,13) * d(ikle(ielem,5))
374 xm(ielem,14) = xm(ielem,14) * d(ikle(ielem,6))
375 xm(ielem,15) = xm(ielem,15) * d(ikle(ielem,6))
377 xm(ielem,16) = xm(ielem,16) * d(ikle(ielem,1))
378 xm(ielem,17) = xm(ielem,17) * d(ikle(ielem,1))
379 xm(ielem,18) = xm(ielem,18) * d(ikle(ielem,1))
380 xm(ielem,19) = xm(ielem,19) * d(ikle(ielem,1))
381 xm(ielem,20) = xm(ielem,20) * d(ikle(ielem,1))
382 xm(ielem,21) = xm(ielem,21) * d(ikle(ielem,2))
383 xm(ielem,22) = xm(ielem,22) * d(ikle(ielem,2))
384 xm(ielem,23) = xm(ielem,23) * d(ikle(ielem,2))
385 xm(ielem,24) = xm(ielem,24) * d(ikle(ielem,2))
386 xm(ielem,25) = xm(ielem,25) * d(ikle(ielem,3))
387 xm(ielem,26) = xm(ielem,26) * d(ikle(ielem,3))
388 xm(ielem,27) = xm(ielem,27) * d(ikle(ielem,3))
389 xm(ielem,28) = xm(ielem,28) * d(ikle(ielem,4))
390 xm(ielem,29) = xm(ielem,29) * d(ikle(ielem,4))
391 xm(ielem,30) = xm(ielem,30) * d(ikle(ielem,5))
395 ELSEIF(typexm(1:1).EQ.
'S')
THEN 398 &
'OM4141 (BIEF) : M=MD NOT AVAILABLE IF M SYMMETRIC')
401 ELSEIF(typexm(1:1).NE.
'0')
THEN 409 ELSEIF(op(3:8).EQ.
'DM ')
THEN 413 IF(typdim(1:1).EQ.
'Q')
THEN 414 CALL ov(
'X=XY ', x=dm, y=d, dim1= ndiag)
415 ELSEIF(typdim(1:1).EQ.
'I')
THEN 416 CALL ov(
'X=Y ', x=dm, y=d, dim1=ndiag)
418 ELSEIF(typdim(1:1).NE.
'0')
THEN 419 WRITE(
lu,13) typdim(1:1)
426 IF(typexm(1:1).EQ.
'Q')
THEN 430 xm(ielem, 1) = xm(ielem, 1) * d(ikle(ielem,1))
431 xm(ielem, 2) = xm(ielem, 2) * d(ikle(ielem,1))
432 xm(ielem, 3) = xm(ielem, 3) * d(ikle(ielem,1))
433 xm(ielem, 4) = xm(ielem, 4) * d(ikle(ielem,1))
434 xm(ielem, 5) = xm(ielem, 5) * d(ikle(ielem,1))
435 xm(ielem, 6) = xm(ielem, 6) * d(ikle(ielem,2))
436 xm(ielem, 7) = xm(ielem, 7) * d(ikle(ielem,2))
437 xm(ielem, 8) = xm(ielem, 8) * d(ikle(ielem,2))
438 xm(ielem, 9) = xm(ielem, 9) * d(ikle(ielem,2))
439 xm(ielem,10) = xm(ielem,10) * d(ikle(ielem,3))
440 xm(ielem,11) = xm(ielem,11) * d(ikle(ielem,3))
441 xm(ielem,12) = xm(ielem,12) * d(ikle(ielem,3))
442 xm(ielem,13) = xm(ielem,13) * d(ikle(ielem,4))
443 xm(ielem,14) = xm(ielem,14) * d(ikle(ielem,4))
444 xm(ielem,15) = xm(ielem,15) * d(ikle(ielem,5))
446 xm(ielem,16) = xm(ielem,16) * d(ikle(ielem,2))
447 xm(ielem,17) = xm(ielem,17) * d(ikle(ielem,3))
448 xm(ielem,18) = xm(ielem,18) * d(ikle(ielem,4))
449 xm(ielem,19) = xm(ielem,19) * d(ikle(ielem,5))
450 xm(ielem,20) = xm(ielem,20) * d(ikle(ielem,6))
451 xm(ielem,21) = xm(ielem,21) * d(ikle(ielem,3))
452 xm(ielem,22) = xm(ielem,22) * d(ikle(ielem,4))
453 xm(ielem,23) = xm(ielem,23) * d(ikle(ielem,5))
454 xm(ielem,24) = xm(ielem,24) * d(ikle(ielem,6))
455 xm(ielem,25) = xm(ielem,25) * d(ikle(ielem,4))
456 xm(ielem,26) = xm(ielem,26) * d(ikle(ielem,5))
457 xm(ielem,27) = xm(ielem,27) * d(ikle(ielem,6))
458 xm(ielem,28) = xm(ielem,28) * d(ikle(ielem,5))
459 xm(ielem,29) = xm(ielem,29) * d(ikle(ielem,6))
460 xm(ielem,30) = xm(ielem,30) * d(ikle(ielem,6))
464 ELSEIF(typexm(1:1).EQ.
'S')
THEN 467 &
'OM4141 (BIEF) : M=MD NOT AVAILABLE IF M SYMMETRIC')
470 ELSEIF(typexm(1:1).NE.
'0')
THEN 472 200
FORMAT(1x,
'OM4141 (BIEF) : TYPEXM NOT AVAILABLE : ',a1)
479 ELSEIF(op(3:8).EQ.
'DMD ')
THEN 483 IF(typdim(1:1).EQ.
'Q')
THEN 484 CALL ov(
'X=XY ', x=dm, y=d, dim1=ndiag)
485 CALL ov(
'X=XY ', x=dm, y=d, dim1=ndiag)
486 ELSEIF(typdim(1:1).EQ.
'I')
THEN 487 CALL ov(
'X=YZ ', x=dm, y=d, z=d, dim1=ndiag)
489 ELSEIF(typdim(1:1).NE.
'0')
THEN 490 WRITE(
lu,13) typdim(1:1)
491 13
FORMAT(1x,
'OM4141 (BIEF) : TYPDIM UNKNOWN :',a1)
498 IF(typexm(1:1).EQ.
'S')
THEN 509 xm(ielem, 1) = xm(ielem, 1) * d(i2) * d(i1)
510 xm(ielem, 2) = xm(ielem, 2) * d(i3) * d(i1)
511 xm(ielem, 3) = xm(ielem, 3) * d(i4) * d(i1)
512 xm(ielem, 4) = xm(ielem, 4) * d(i5) * d(i1)
513 xm(ielem, 5) = xm(ielem, 5) * d(i6) * d(i1)
514 xm(ielem, 6) = xm(ielem, 6) * d(i3) * d(i2)
515 xm(ielem, 7) = xm(ielem, 7) * d(i4) * d(i2)
516 xm(ielem, 8) = xm(ielem, 8) * d(i5) * d(i2)
517 xm(ielem, 9) = xm(ielem, 9) * d(i6) * d(i2)
518 xm(ielem,10) = xm(ielem,10) * d(i4) * d(i3)
519 xm(ielem,11) = xm(ielem,11) * d(i5) * d(i3)
520 xm(ielem,12) = xm(ielem,12) * d(i6) * d(i3)
521 xm(ielem,13) = xm(ielem,13) * d(i5) * d(i4)
522 xm(ielem,14) = xm(ielem,14) * d(i6) * d(i4)
523 xm(ielem,15) = xm(ielem,15) * d(i6) * d(i5)
527 ELSEIF(typexm(1:1).EQ.
'Q')
THEN 538 xm(ielem, 1) = xm(ielem, 1) * d(i2) * d(i1)
539 xm(ielem, 2) = xm(ielem, 2) * d(i3) * d(i1)
540 xm(ielem, 3) = xm(ielem, 3) * d(i4) * d(i1)
541 xm(ielem, 4) = xm(ielem, 4) * d(i5) * d(i1)
542 xm(ielem, 5) = xm(ielem, 5) * d(i6) * d(i1)
543 xm(ielem, 6) = xm(ielem, 6) * d(i3) * d(i2)
544 xm(ielem, 7) = xm(ielem, 7) * d(i4) * d(i2)
545 xm(ielem, 8) = xm(ielem, 8) * d(i5) * d(i2)
546 xm(ielem, 9) = xm(ielem, 9) * d(i6) * d(i2)
547 xm(ielem,10) = xm(ielem,10) * d(i4) * d(i3)
548 xm(ielem,11) = xm(ielem,11) * d(i5) * d(i3)
549 xm(ielem,12) = xm(ielem,12) * d(i6) * d(i3)
550 xm(ielem,13) = xm(ielem,13) * d(i5) * d(i4)
551 xm(ielem,14) = xm(ielem,14) * d(i6) * d(i4)
552 xm(ielem,15) = xm(ielem,15) * d(i6) * d(i5)
553 xm(ielem,16) = xm(ielem,16) * d(i2) * d(i1)
554 xm(ielem,17) = xm(ielem,17) * d(i3) * d(i1)
555 xm(ielem,18) = xm(ielem,18) * d(i4) * d(i1)
556 xm(ielem,19) = xm(ielem,19) * d(i5) * d(i1)
557 xm(ielem,20) = xm(ielem,20) * d(i6) * d(i1)
558 xm(ielem,21) = xm(ielem,21) * d(i3) * d(i2)
559 xm(ielem,22) = xm(ielem,22) * d(i4) * d(i2)
560 xm(ielem,23) = xm(ielem,23) * d(i5) * d(i2)
561 xm(ielem,24) = xm(ielem,24) * d(i6) * d(i2)
562 xm(ielem,25) = xm(ielem,25) * d(i4) * d(i3)
563 xm(ielem,26) = xm(ielem,26) * d(i5) * d(i3)
564 xm(ielem,27) = xm(ielem,27) * d(i6) * d(i3)
565 xm(ielem,28) = xm(ielem,28) * d(i5) * d(i4)
566 xm(ielem,29) = xm(ielem,29) * d(i6) * d(i4)
567 xm(ielem,30) = xm(ielem,30) * d(i6) * d(i5)
571 ELSEIF(typexm(1:1).NE.
'0')
THEN 572 WRITE(
lu,21) typexm(1:1)
573 21
FORMAT(1x,
'OM4141 (BIEF) : TYPEXM UNKNOWN :',a1)
580 ELSEIF(op(3:8).EQ.
'0 ')
THEN 582 CALL ov(
'X=C ', x=dm, c=0.d0, dim1=ndiag)
584 IF(typexm(1:1).EQ.
'S')
THEN 586 CALL ov(
'X=C ', x=xm(1,i), c=0.d0, dim1=nelem)
588 ELSEIF(typexm(1:1).EQ.
'Q')
THEN 590 CALL ov(
'X=C ', x=xm(1,i), c=0.d0, dim1=nelem)
592 ELSEIF(typexm(1:1).NE.
'0')
THEN 593 WRITE(
lu,711) typexm(1:1)
594 711
FORMAT(1x,
'OM4141 (BIEF) : TYPEXM UNKNOWN :',a1)
604 ELSEIF(op(3:8).EQ.
'X(M) ')
THEN 606 IF(typexm(1:1).EQ.
'S')
THEN 608 CALL ov(
'X=Y ', x=xm(1,i+15), y=xm(1,i), dim1=nelem)
610 ELSEIF(typexm(1:1).NE.
'0')
THEN 611 WRITE(
lu,811) typexm(1:1)
612 811
FORMAT(1x,
'OM4141 (BIEF) : MATRIX ALREADY NON SYMMETRICAL: ',
621 ELSEIF(op(3:8).EQ.
'MSK(M)')
THEN 623 IF(typexm(1:1).EQ.
'S')
THEN 625 ELSEIF(typexm(1:1).EQ.
'Q')
THEN 627 ELSEIF(typexm(1:1).EQ.
'0')
THEN 638 CALL ov(
'X=XY ', x=xm(1,i), y=d, dim1=nelem)
644 ELSEIF(op(3:8).EQ.
'M+D ')
THEN 646 CALL ov(
'X=X+Y ', x=dm, y=d, dim1=ndiag)
655 41
FORMAT(1x,
'OM4141 (BIEF) : UNKNOWN OPERATION : ',a8)
subroutine ov(OP, X, Y, Z, C, DIM1)
subroutine om4141(OP, DM, TYPDIM, XM, TYPEXM, DN, TYPDIN, XN, TYPEXN, D, C, IKLE, NELEM, NELMAX, NDIAG, STOX)