14 character*132 string(100)
24 READ(9,*,err=400) ldimr
25 READ(9,*,err=400) nparam
27 READ(9,*,err=400) param(i)
30 call bcast(ldimr,isize)
31 call bcast(nparam,isize)
32 call bcast(param ,200*wdsize)
38 IF (npscl1.GT.ldimt)
THEN
40 WRITE(6,21) ldimt,npscl1
41 21
FORMAT(//,2x,
'Error: This NEKTON Solver has been compiled'
42 $ /,2x,
' for',i4,
' passive scalars. This run'
43 $ /,2x,
' requires that LDIMT be set to',i4,
'.')
52 restol(1+i) = param(22)
54 call bcast(restol, (ldimt1+1)*wdsize)
64 if(param(2) .lt.0.0) param(2) = -1.0/param(2)
65 if(param(8) .lt.0.0) param(8) = -1.0/param(8)
66 if(param(29).lt.0.0) param(29) = -1.0/param(29)
78 READ(9,*,err=400) nskip
79 IF (nskip.GT.0 .AND. npscal.GT.0)
THEN
80 READ(9,*,err=400)(cpfld(i,1),i=3,npscl2)
81 IF(npscl2.LT.9)
READ(9,*)
82 READ(9,*,err=400)(cpfld(i,2),i=3,npscl2)
83 IF(npscl2.LT.9)
READ(9,*)
85 if (cpfld(i,1).lt.0) cpfld(i,1) = -1./cpfld(i,1)
86 if (cpfld(i,2).lt.0) cpfld(i,2) = -1./cpfld(i,2)
94 call bcast(cpfld,wdsize*ldimt1*3)
100 ifprojfld(0) = .false.
106 iffilter(i) = .false.
109 ifprojfld(i) = .false.
110 if (param(94).gt.0) ifprojfld(i) = .true.
152 IF(nid.EQ.0)
READ(9,*,err=500) nlogic
153 call bcast(nlogic,isize)
154 IF(nlogic.GT.100)
THEN
156 $
write(6,*)
'ABORT: Too many logical switches', nlogic
160 if(nid.eq.0)
READ(9,
'(A132)',err=500) (string(i),i=1,nlogic)
161 call bcast(string,100*132*csize)
164 call capit(string(i),132)
165 if (
indx1(string(i),
'IFTMSH' ,6).gt.0)
then
166 read(string(i),*,err=490) (iftmsh(ii),ii=0,npscl2)
167 elseif (
indx1(string(i),
'IFNAV' ,5).gt.0 .and.
168 &
indx1(string(i),
'IFADVC' ,6).gt.0)
then
169 read(string(i),*,err=490) (ifadvc(ii),ii=1,npscl2)
170 elseif (
indx1(string(i),
'IFADVC' ,6).gt.0)
then
171 read(string(i),*,err=490) (ifadvc(ii),ii=1,npscl2)
172 elseif (
indx1(string(i),
'IFFLOW' ,6).gt.0)
then
173 read(string(i),*) ifflow
174 elseif (
indx1(string(i),
'IFHEAT' ,6).gt.0)
then
175 read(string(i),*) ifheat
176 elseif (
indx1(string(i),
'IFTRAN' ,6).gt.0)
then
177 read(string(i),*) iftran
178 elseif (
indx1(string(i),
'IFAXIS' ,6).gt.0)
then
179 read(string(i),*) ifaxis
180 elseif (
indx1(string(i),
'IFAZIV' ,6).gt.0)
then
181 read(string(i),*) ifaziv
182 elseif (
indx1(string(i),
'IFSTRS' ,6).gt.0)
then
183 read(string(i),*) ifstrs
184 elseif (
indx1(string(i),
'IFLO' ,4).gt.0)
then
185 read(string(i),*) iflomach
186 elseif (
indx1(string(i),
'IFMGRID',7).gt.0)
then
188 elseif (
indx1(string(i),
'IFKEPS' ,6).gt.0)
then
189 read(string(i),*) ifkeps
190 elseif (
indx1(string(i),
'IFMODEL',7).gt.0)
then
191 read(string(i),*) ifmodel
192 elseif (
indx1(string(i),
'IFMVBD' ,6).gt.0)
then
193 read(string(i),*) ifmvbd
194 elseif (
indx1(string(i),
'IFCHAR' ,6).gt.0)
then
195 read(string(i),*) ifchar
196 elseif (
indx1(string(i),
'IFDG' ,4).gt.0)
then
197 read(string(i),*) ifdg
198 elseif (
indx1(string(i),
'IFANLS' ,6).gt.0)
then
199 read(string(i),*) ifanls
200 elseif (
indx1(string(i),
'IFCOUP' ,6).gt.0)
then
201 read(string(i),*) ifcoup
202 elseif (
indx1(string(i),
'IFVCOUP' ,7).gt.0)
then
203 read(string(i),*) ifvcoup
204 elseif (
indx1(string(i),
'IFMHD' ,5).gt.0)
then
205 read(string(i),*) ifmhd
206 elseif (
indx1(string(i),
'IFCONS' ,6).gt.0)
then
207 read(string(i),*) ifcons
208 elseif (
indx1(string(i),
'IFUSERVP',8).gt.0)
then
209 read(string(i),*) ifuservp
210 elseif (
indx1(string(i),
'IFUSERMV',8).gt.0)
then
211 read(string(i),*) ifusermv
212 elseif (
indx1(string(i),
'IFCYCLIC',8).gt.0)
then
213 read(string(i),*) ifcyclic
214 elseif (
indx1(string(i),
'IFPERT' ,6).gt.0)
then
215 read(string(i),*) ifpert
216 elseif (
indx1(string(i),
'IFBASE' ,6).gt.0)
then
217 read(string(i),*) ifbase
218 elseif (
indx1(string(i),
'IFSYNC' ,6).gt.0)
then
219 read(string(i),*) ifsync
220 elseif (
indx1(string(i),
'IFSCHCLOB',9).gt.0)
then
221 read(string(i),*) ifschclob
222 elseif (
indx1(string(i),
'IFSPLIT' ,7).gt.0)
then
226 write(6,
'(1X,2A)')
'ABORT: Unknown logical flag', string
228 &
' Available logical flags:',
260 if (ifsplit) ifmgrid = .true.
262 if (ifaxis.and..not.ifsplit)
then
269 if (param(29).ne.0.) ifmhd = .true.
270 if (ifmhd) ifessr = .true.
271 if (ifmhd) npscl1 = npscl1 + 1
272 if (param(30).gt.0) ifuservp = .true.
273 if (param(31).ne.0.) ifpert = .true.
274 if (param(31).lt.0.) ifbase = .false.
275 npert = abs(param(31))
277 IF (npscl1.GT.ldimt .AND. ifmhd)
THEN
279 WRITE(6,22) ldimt,npscl1
280 22
FORMAT(/s,2x,
'Error: This NEKTON Solver has been compiled'
281 $ /,2x,
' for',i4,
' passive scalars. A MHD run'
282 $ /,2x,
' requires that LDIMT be set to',i4,
'.')
288 if (lx1.ne.lx1m.or.ly1.ne.ly1m.or.lz1.ne.lz1m)
289 $
call exitti(
'Need lx1m=lx1 etc. in SIZE . $',lx1m)
294 cpfld(ifldmhd,1) = param(29)
295 cpfld(ifldmhd,2) = param( 1)
300 if (.not.iftran)
then
301 if (ifflow.and.ifsplit)
then
312 IF(ldimr.NE.ldim)
THEN
314 WRITE(6,10) ldim,ldimr
315 10
FORMAT(//,2x,
'ERROR: This NEKTON Solver has been compiled'
316 $ /,2x,
' for spatial dimension equal to',i2,
'.'
317 $ /,2x,
' The data file has dimension',i2,
'.')
321 IF (ldim.EQ.3) if3d=.true.
322 IF (ldim.NE.3) if3d=.false.
325 if (ly1.ne.lx1.or.lz1.ne.lx1)
then
326 if (nid.eq.0)
write(6,13) lx1,ly1,lz1
327 13
format(
'ERROR: lx1,ly1,lz1:',3i5,
' must be equal for 3D')
330 if (ly2.ne.lx2.or.lz2.ne.lx2)
then
331 if (nid.eq.0)
write(6,14) lx2,ly2,lz2
332 14
format(
'ERROR: lx2,ly2,lz2:',3i5,
' must be equal for 3D')
336 if (ly1.ne.lx1.or.lz1.ne.1)
then
337 if (nid.eq.0)
write(6,12) lx1,ly1,lz1
338 12
format(
'ERROR: ',3i5,
' must have lx1=ly1; lz1=1, for 2D')
341 if (ly2.ne.lx2.or.lz2.ne.1)
then
342 if (nid.eq.0)
write(6,11) lx2,ly2,lz2
343 11
format(
'ERROR: ',3i5,
' must have lx2=ly2; lz2=1, for 2D')
348 if (lgmres.lt.5 .and. param(42).eq.0)
then
349 if(nid.eq.0)
write(6,*)
350 $
'WARNING: lgmres might be too low!'
356 if (nid.eq.0)
write(6,43) lx1,lx2
357 43
format(
'ERROR: lx1,lx2:',2i4,
' must be equal for IFSPLIT=T')
361 if (lx2.lt.lx1-2)
then
362 if (nid.eq.0)
write(6,44) lx1,lx2
363 44
format(
'ERROR: lx1,lx2:',2i4,
' lx2 must be lx-2 for IFSPLIT=F')
368 if (param(40).eq.3 .and. .not.ifsplit)
then
370 $ (
'ERROR: Selected preconditioner requires lx2=lx1$',lx2)
374 if(nid.eq.0)
write(6,*)
375 $
'ABORT: Using CVODE requires .par file!'
379 if (ifsplit .and. ifuservp .and. .not.ifstrs)
then
380 if(nid.eq.0)
write(6,*)
381 $
'Enable stress formulation to support PN/PN and IFUSERVP=T'
385 if (ifcyclic .and. .not.ifstrs)
then
386 if(nid.eq.0)
write(6,*)
387 $
'Enable stress formulation to support cyclic BC'
391 ktest = (lx1-lx1m) + (ly1-ly1m) + (lz1-lz1m)
392 if (ifstrs.and.ktest.ne.0)
then
393 if(nid.eq.0)
write(6,*)
394 $
'ABORT: Stress formulation requires lx1m=lx1, etc. in SIZE'
404 if (ifsplit .and. ifmhd)
then
405 if(nid.eq.0)
write(6,*)
406 $
'ABORT: MHD in Pn-Pn is not supported'
410 if (ifneknekc.and.(nelgv.ne.nelgt))
call exitti(
411 $
'ABORT: nek-nek not supported w/ conj. ht transfer$',1)
413 if (ifchar.and.(nelgv.ne.nelgt))
call exitti(
414 $
'ABORT: IFCHAR curr. not supported w/ conj. ht transfer$',nelgv)
416 if (ifmhd .and. lbx1.ne.lx1)
then
417 if(nid.eq.0)
write(6,*)
418 $
'ABORT: For MHD, need lbx1=lx1, etc.; Change SIZE '
422 if (ifpert .and. lpx1.ne.lx1)
then
423 if(nid.eq.0)
write(6,*)
424 $
'ABORT: For Lyapunov, need lpx1=lx1, etc.; Change SIZE '
427 if (if3d) ifaxis = .false.
429 if (iflomach .and. .not.ifsplit)
then
430 if(nid.eq.0)
write(6,*)
431 $
'ABORT: For lowMach, need lx2=lx1, etc.; Change SIZE '
435 if (iflomach .and. .not.ifheat)
then
436 if(nid.eq.0)
write(6,*)
437 $
'ABORT For lowMach, need ifheat=true; Change IFHEAT'
441 if (ifmhd) ifchar = .false.
444 if (param(99).lt.0)
then
448 if (ifaxis) param(99) = 3
449 if (ifmvbd) param(99) = 3
452 if (ifchar .and. param(99).lt.0)
then
453 if (nid.eq.0)
write(6,*)
454 &
'ABORT: Characteristic scheme needs dealiasing!'
458 if (.not.ifsplit .and. ifaxis .and. ifstrs)
then
459 if (nid.eq.0)
write(6,*)
460 $
'ABORT: Axisymetric and stress formulation not supported ' //
465 if (param(99).gt.-1 .and. (lxd.lt.lx1 .or. lyd.lt.ly1 .or.
467 if(nid.eq.0)
write(6,*)
468 &
'ABORT: Dealiasing space too small; Check lxd,lyd,lzd in SIZE '
493 if (param(103).gt.0)
then
495 call ltrue(iffilter,
size(iffilter))
504 if(nid.eq.0)
WRITE(6,401)
505 401
FORMAT(2x,
'ERROR READING PARAMETER DATA'
506 $ ,/,2x,
'ABORTING IN ROUTINE RDPARAM.')
510 if(nid.eq.0)
WRITE(6,501)
511 501
FORMAT(2x,
'ERROR READING LOGICAL DATA'
512 $ ,/,2x,
'ABORTING IN ROUTINE RDPARAM.')
540 IF (
gllnid(ieg).EQ.nid)
THEN
546 read(9,*,err=31,
end=600) adum
551 READ(9,*,err=500,
END=600) (XC(IC,IEL),IC=1,4)
552 READ(9,*,err=500,
END=600) (YC(IC,IEL),IC=1,4)
553 call rzero (zc(1 ,iel) ,4)
554 ELSE IF(ldim.EQ.3)
THEN
555 READ(9,*,err=500,
END=600) (XC(IC,IEL),IC=1,4)
556 READ(9,*,err=500,
END=600) (YC(IC,IEL),IC=1,4)
557 READ(9,*,err=500,
END=600) (ZC(IC,IEL),IC=1,4)
558 READ(9,*,err=500,
END=600) (XC(IC,IEL),IC=5,8)
559 READ(9,*,err=500,
END=600) (YC(IC,IEL),IC=5,8)
560 READ(9,*,err=500,
END=600) (ZC(IC,IEL),IC=5,8)
564 READ(9,41,err=500,
END=600) adum
567 READ(9,41,err=500,
END=600) adum
568 READ(9,41,err=500,
END=600) adum
569 ELSE IF(ldim.EQ.3)
THEN
570 READ(9,41,err=500,
END=600) adum
571 READ(9,41,err=500,
END=600) adum
572 READ(9,41,err=500,
END=600) adum
573 READ(9,41,err=500,
END=600) adum
574 READ(9,41,err=500,
END=600) adum
575 READ(9,41,err=500,
END=600) adum
588 if(nid.eq.0)
WRITE(6,401)
589 401
FORMAT(2x,
'ERROR READING SCALE FACTORS, CHECK READ FILE'
590 $ ,/,2x,
'ABORTING IN ROUTINE RDMESH.')
594 if(nid.eq.0)
WRITE(6,501) ieg
595 501
FORMAT(2x,
'ERROR READING MESH DATA NEAR ELEMENT',i12
596 $ ,/,2x,
'ABORTING IN ROUTINE RDMESH.')
600 if(nid.eq.0)
WRITE(6,601) ieg
601 601
FORMAT(2x,
'ERROR 2 READING MESH DATA NEAR ELEMENT',i12
602 $ ,/,2x,
'ABORTING IN ROUTINE RDMESH.')
629 CALL rzero(curve ,72*lelt)
630 CALL blank(ccurve,12*lelt)
631 IF (ncurve.GT.0)
THEN
632 DO 50 icurve=1,ncurve
633 IF (nelgt.LT.1000)
THEN
634 READ(9,60,err=500,
END=500) IEDG,IEG,R1,R2,R3,R4,R5,ans
635 ELSEIF (nelgt.LT.1 000 000)
THEN
636 READ(9,61,err=500,
END=500) IEDG,IEG,R1,R2,R3,R4,R5,ans
638 READ(9,62,err=500,
END=500) IEDG,IEG,R1,R2,R3,R4,R5,ans
640 60
FORMAT(i3,i3 ,5g14.6,1x,a1)
641 61
FORMAT(i2,i6 ,5g14.6,1x,a1)
642 62
FORMAT(i2,i12,5g14.6,1x,a1)
644 IF (
gllnid(ieg).EQ.nid)
THEN
651 ccurve( iedg,iel)=ans
660 if(nid.eq.0)
WRITE(6,501)
661 501
FORMAT(2x,
'ERROR READING CURVE SIDE DATA'
662 $ ,/,2x,
'ABORTING IN ROUTINE RDCURVE.')
671 CALL rzero(curve ,72*lelt)
672 CALL blank(ccurve,12*lelt)
673 IF (ncurve.GT.0)
THEN
674 DO 1050 icurve=1,ncurve
675 READ(8,err=1500,
END=1500) IEDG,IEG,R1,R2,R3,R4,R5,ans
676 IF (
gllnid(ieg).EQ.nid)
THEN
683 ccurve( iedg,iel)=ans
692 if(nid.eq.0)
WRITE(6,1501)
693 1501
FORMAT(2x,
'ERROR READING unformatted CURVE SIDE DATA'
694 $ ,/,2x,
'ABORTING IN ROUTINE RDCURVE.')
712 CHARACTER CBC1*1,CBC3*3,CHTEMP*1,CHTMP3*3
713 equivalence(chtemp,chtmp3)
719 IF (ifheat) nfldt=2+npscal
720 if (ifmhd ) nfldt=2+npscal+1
728 lcbc=18*lelt*(ldimt1 + 1)
729 lrbc=30*lelt*(ldimt1 + 1)
739 READ(9,*,err=500,
END=500)
741 DO 100 ifield=ibcnew,nbcs
743 if (.not.iftmsh(ifield)) nel = nelgv
746 call capit(string,132)
756 if (
indx1(string,
'NO ',3).eq.0)
then
758 IF(vnekton .LE. 2.52) nbcrea = 3
759 IF(vnekton .GE. 2.55) nbcrea = 5
763 IF (
gllnid(ieg).EQ.nid)
THEN
765 IF (nelgt.LT.1000)
THEN
766 READ(9,50,err=500,
END=500)
768 $ cbc(iside,iel,ifield),id1,id2,
769 $ (bc(ii,iside,iel,ifield),ii=1,nbcrea)
774 50
FORMAT(a1,a3,2i3,5g14.6)
775 ELSEIF (nelgt.LT.100 000)
THEN
776 READ(9,51,err=500,
END=500)
778 $ cbc(iside,iel,ifield),id1,id2,
779 $ (bc(ii,iside,iel,ifield),ii=1,nbcrea)
780 51
FORMAT(a1,a3,i5,i1,5g14.6)
781 ELSEIF (nelgt.LT.1 000 000)
THEN
782 READ(9,52,err=500,
END=500)
784 $ cbc(iside,iel,ifield),id1,
785 $ (bc(ii,iside,iel,ifield),ii=1,nbcrea)
786 52
FORMAT(a1,a3,i6,5g14.6)
788 READ(9,53,err=500,
END=500)
790 $ cbc(iside,iel,ifield),id1,
791 $ (bc(ii,iside,iel,ifield),ii=1,nbcrea)
792 53
FORMAT(a1,a3,i12,5g18.11)
795 IF (chtemp.NE.
' ') cbc(iside,iel,0)(1:1)= chtemp
797 cbc1=cbc(iside,iel,ifield)
798 cbc3=cbc(iside,iel,ifield)
807 READ(9,*,err=500,
END=500) cbc1
817 IF (nfldt.EQ.1)
READ(9,*,err=500,
END=500)
824 if(nid.eq.0)
WRITE(6,501) ifield,ieg
825 501
FORMAT(2x,
'ERROR READING BOUNDARY CONDITIONS FOR FIELD',i4,i12
826 $ ,/,2x,
'ABORTING IN ROUTINE RDBDRY.')
838 DO 1100 ifield=ibcs,nbcs
844 DO 1080 iside=1,nsides
845 IF (
gllnid(ieg).EQ.nid)
THEN
847 READ(8,err=1500,
END=1500)
849 $ cbc(iside,iel,ifield),id1,id2,
850 $ (bc(ii,iside,iel,ifield),ii=1,nbcrea)
853 IF (chtemp.NE.
' ') cbc(iside,iel,0)(1:1)= chtemp
857 READ(8,err=1500,
END=1500) CHTMP3,
858 $ cbcs(iside,iel),id1,id2,(bcs(ii,iside,iel),ii=1,nbcrea)
871 if(nid.eq.0)
WRITE(6,1501) ifield,ieg
872 1501
FORMAT(2x,
'ERROR READING BOUNDARY CONDITIONS FOR FIELD',i4,i12
873 $ ,/,2x,
'(unformatted) ABORTING IN ROUTINE RDBDRY.')
897 call blank(initc,15*132)
898 read (9,80,err=200,
end=200) line
900 if (
indx1(line,
'RESTART',7).ne.0)
then
901 if (.not.
ifgtil(nskip,line))
goto 200
904 read(9,80,err=200,
end=200) initc(i)
906 read(9,80,err=200,
end=200) line
910 if (.not.
ifgtil(nskip,line))
goto 200
914 read(9,80,err=200,
end=200) line
918 read(9,*,err=200,
end=200)
919 read(9,*,err=200,
end=200) nskip
921 read(9,80,err=200,
end=200) line
927 call bcast(initc,15*132*csize)
939 if (nid.eq.0)
write(6,300)
940 300
format(2x,
'Error reading initial condition/drive force data'
941 $ ,/,2x,
'aborting in routine rdicdf.')
942 call exitti(
'rdicdf error$',ierr)
960 CALL izero(matype,16*ldimt1)
961 CALL rzero(cpgrp ,48*ldimt1)
966 READ(9,*,err=200,
END=200)
967 READ(9,*,err=200,
END=200) nskip
968 READ(9,*,err=200,
END=200) npacks
971 READ(9,*)igrp,ifld,itype
972 matype(igrp,ifld)=itype
974 IF(itype.EQ.1)
READ(9,* ) cpgrp(igrp,ifld,iprop)
975 IF(itype.EQ.2)
READ(9,80) line
980 CALL bcast(matype,16*ldimt1*isize)
981 CALL bcast(cpgrp ,48*ldimt1*wdsize)
988 if(nid.eq.0)
WRITE(6,201)
989 201
FORMAT(2x,
'ERROR READING MATERIAL PROPERTIES DATA'
990 $ ,/,2x,
'ABORTING IN ROUTINE RDMATP.')
1010 read (9,*,err=200,
end=200) nhis
1021 if(nid.eq.0)
WRITE(6,201)
1022 201
FORMAT(2x,
'ERROR READING HISTORY DATA'
1023 $ ,/,2x,
'ABORTING IN ROUTINE RDHIST.')
1039 logical lbuf(5+ldimt1)
1041 call lfalse(lbuf,5+ldimt1)
1046 READ(9,*,err=200,
END=200)
1047 READ(9,*,err=200,
END=200) nouts
1048 READ(9,*,err=200,
END=200) ifxyo
1049 READ(9,*,err=200,
END=200) ifvo
1050 READ(9,*,err=200,
END=200) ifpo
1051 READ(9,*,err=200,
END=200) ifto
1052 READ(9,*,err=200,
END=200) ifbo
1062 call lfalse(ifpsco,ldimt1)
1063 read(9,*,err=200,
end=200) ipsco
1064 if (ipsco.gt.0)
then
1065 if (ipsco.gt.ldimt1)
then
1069 read(9,*,err=200,
end=200) ifpsco(i)
1080 if (iflag.gt.0)
call exitti
1081 $ (
'Error in rdout. Increase ldimt1 in SIZE to$',ipsco)
1084 call bcast(lbuf ,lsize*k)
1085 call bcast(ipsco,isize )
1106 201
FORMAT(2x,
'ERROR READING OUTPUT SPECIFICATION DATA'
1107 $ ,/,2x,
'ABORTING IN ROUTINE RDOUT.')
1128 READ(9,*,err=200,
END=200)
1129 READ(9,*,err=200,
END=200) nobj
1131 IF(nobj.GT.maxobj) ierr=1
1135 READ(9,*,err=200,
END=200) NMEMBER(IOBJ)
1136 IF(nmember(iobj).GT.maxmbr)
THEN
1137 print*,
'ERROR: Too many members in object ',iobj
1141 DO 5 member=1,nmember(iobj)
1142 READ(9,*,err=200,
END=200) OBJECT(IOBJ,MEMBER,1),
1143 $ object(iobj,member,2)
1147 write(6,*) nobj,
' objects found'
1148 $ ,(nmember(k),k=1,nobj)
1151 call err_chk(ierr,
'ERROR, too many objects:$')
1153 call bcast(nobj ,isize)
1154 call bcast(nmember,maxobj*isize)
1155 call bcast(object ,maxobj*maxmbr*2*isize)
subroutine lfalse(IFA, N)
subroutine exitti(stringi, idata)
subroutine bcast(buf, len)
subroutine err_chk(ierr, string)
integer function gllel(ieg)
integer function gllnid(ieg)
logical function ifgtil(IVALUE, LINE)
subroutine capit(lettrs, n)
integer function indx1(S1, S2, L2)