File: icse.f

package info (click to toggle)
scilab 4.0-12
  • links: PTS
  • area: non-free
  • in suites: etch, etch-m68k
  • size: 100,640 kB
  • ctags: 57,333
  • sloc: ansic: 377,889; fortran: 242,862; xml: 179,819; tcl: 42,062; sh: 10,593; ml: 9,441; makefile: 4,377; cpp: 1,354; java: 621; csh: 260; yacc: 247; perl: 130; lex: 126; asm: 72; lisp: 30
file content (756 lines) | stat: -rw-r--r-- 27,274 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
      subroutine icse(ind,nu,u,co,g,itv,rtv,dtv,icsef,icsec2,icsei)
c!but
c     Le logiciel ICSE est un outil de resolution de problemes de
c     CONTROLE OPTIMAL de systemes decrits par des equations
c     differentielles ou algebrico-differentielles, NON LINEAIRES.
c     Dans la mesure ou dans la methode d'integration qu'il utilise
c     est inconditionnellement stable,il peut aussi etre utilise pour
c     resoudre des problemes de controle d'EQUATIONS AUX DERIVEES
c     PARTIELLES DYNAMIQUES (reaction-diffusion, par exemple), ou
c     plus generalement pour controler des systemes raides.
c     Le controle se decompose en une partie independante du temps et
c     une partie dependante du temps.Cette structure permet a
c     l'utilisateur de resoudre facilement les problemes
c     d'IDENTIFICATION DE PARAMETRES d'un systeme dynamique par des
c     methodes de MOINDRES CARRES. Diverses facilites sont d'ailleurs
c     prevues pour ce cas.
c     Dans le cas d'un SYSTEME LINEAIRE,l'integration de l'etat et de
c     l'etat adjoint sont effectuees de maniere a tirer parti de la
c     linearite de l'equation.
c
c     Resolution de problemes de controle ou d'identification de
c      parametres de systemes dynamiques du type:
c          0=fi(t,y,u),i<=nea et dyj/dt=fj(t,y,u),nea<j<=ny pour t>=t0
c          et y(t0)=y0 , en notant ny la dimension de l'etat y et
c          fk la keme composante de la fonction f
c      On effectue un certain nombre (nex) d'experiences identiques
c      au cours desquelles certaines donnees sont mesurees.
c      Le critere a minimiser est de la forme c(tob,ytob,ob) avec:
c        tob(ntob)       :instants de mesure
c        ytob(ny,ntob)   :valeurs de l'etat aux instants de mesure
c        ob(nex,ntob,nob):mesures
c      L'equation d'etat est discretisee par la methode
c      de Crank-Nicolson.
c      Le gradient du cout est calcule en utilisant l'etat adjoint du
c      systeme discretise.
c
c!origine
c      F.Bonnans,G.Launay, INRIA, 1987
c
c! DESCRIPTION FORMELLE DES PROBLEMES DE CONTROLE CONSIDERES
c       L'equation du systeme est de la forme
c              0     =  fi(t,y(t),uc,uv(t)) ,  i<=nea,
c          dyi(t)/dt =  fi(t,y(t),uc,uv(t)) ,  i> nea,
c       et
c          t0<= t <=tf ,    y(t0)=y0 .
c     avec :
c       y(t )  : etat du systeme,
c       uc     : partie  du controle independante du temps
c               (controle constant),
c       uv     : partie  du controle dependante du temps
c                (controle variable)
c       t0, tf : instant initial et instant final,
c       y0     : etat initial. Il est soit fixe,soit fonction
c                du controle [y0=ei(uc,uv)]
c
c       Le critere a minimiser est de la forme  :
c
c                  tp
c                   ____
c                  \
c                   |    c2(ti,y(ti),uc) .
c                  /___
c                  ti =t1
c
c        Sont resolus, soit des problemes sans contraintes,  soit des
c     problemes comportant des contraintes de borne sur le controle.On
c     peut aussi utiliser ICSE pour resoudre des problemes comportant
c     des contraintes sur  l'etat, en traitant  ces contraintes par
c     penalisation ou lagrangien augmente [Ber,82].
c        Les fonctions  f,c1,c2,ei et leurs derivees  partielles sont
c     fournies par l'utilisateur sous forme de subroutines Fortran.
c
c
c
c! OUTILS POUR L'IDENTIFICATION DE PARAMETRES
c     Le probleme de l'identification de parametres (ou d'ajustement
c     de parametres a des mesures) a les caracteristiques suivantes :
c     le critere est fonction seulement de mesures faites a certains
c     instants et des valeurs de l'etat a ces instants.Seule la seconde
c     partie du cout intervient donc.Les mesures peuvent avoir ete
c     obtenues lors de plusieurs experiences.En general,le critere
c     est du type MOINDRES CARRES associe a une OBSERVATION LINEAIRE
c     .Autrement dit, il est de la forme
c
c                nex      ntob
c                ____     ____                              2
c           1    \        \      ||                       ||
c           -     |        |     || obs*y(ti) - z(iex,ti) || ,
c           2    /___     /___   ||                       ||
c                iex=1    ti =t1
c
c     ou obs est  la  matrice  d'observation et  z(iex,ti) represente
c     l'ensemble  des  mesures  faites  lors  de l'experience iex,  a
c     l'instant ti.Dans ce cas,l'utilisateur n'a aucune modification a
c     a apporter  a la subroutine de calcul  de cout  de l'exemple de
c     demonstration.
c!liste d'appel:
c      icse(ind,nu,u,co,g,itv,rtv,dtv)
c      en entree:
c
c      ind        entier egal a 2,3,ou4
c
c      nu         entier
c                 dimension du vecteur des parametres
c
c      u          double precision (nu)
c                 vecteur des parametres
c
c      en sortie:
c
c      co         double precision
c                 cout
c
c      g          double precision (nu)
c                 gradient de la fonction de cout c
c
c      itv        entier (nitv)
c                 tableau de travail entier
c
c      rtv        reel (nrtv)
c                 tableau de travail reel
c
c      dtv        double precision (ndtv)
c                 tableau de travail double precision
c
c!subroutines utilisees
c      Linpack    :dadd,daxpy,dcopy,dmmul,dnrm2,dscal,dset,
c                  dgefa,dgesl
c                 :icse0,icse1,icse2,icscof,icsef,icsei
c      common/nird/nitv,nrtv,ndtv
c!utilisation
c
c     Le probleme a traiter doit etre defini par 3 routines
c     fortran ecrites par l'utilisateur :
c
c      -Second membre de l'equation d'etat :
c       icsef(indf,t,y,uc,uv,f,fy,fu,b,itu,dtu,
c     & t0,tf,dti,dtf,ermx,iu,nuc,nuv,ilin,nti,ntf,ny,nea,
c     & itmx,nex,nob,ntob,ntobi,nitu,ndtu)
c       Parametres d'entree :
c        indf     : vaut 1,2,3 suivant qu'on veut calculer f,fy,fu
c        t        : instant courant
c        y(ny)    : etat a un instant donne
c        uc(nuc)  : controle independant du temps
c        uv(nuv)  : controle dependant du temps, a l'instant t
c        b(ny)    : terme constant dans le cas lineaire quadratique
c       Parametres de sortie :
c         indf    : >0 si  le calcul s'est  correctement effectue,<=0
c                   sinon
c        f(ny)    : second membre
c        fy(ny,ny): jacobien de f par rapport a y
c        fu(ny,nuc+nuv) : derivee de f par rapport au controle
c       Tableaux de travail reserves a l'utilisateur :
c        itu(nitu): tableau entier
c        dtu(ndtu): tableau double precision
c       (nitu et ndtu sont initialises par le common icsez).
c
c      -Cout ponctuel :
c       icsec2(indc,nu,tob,obs,cof,ytob,ob,u,c2,c2y,g,yob,d,itu,dtu,
c     & t0,tf,dti,dtf,ermx,iu,nuc,nuv,ilin,nti,ntf,ny,nea,
c     & itmx,nex,nob,ntob,ntobi,nitu,ndtu)
c       Parametres d'entree :
c        indc     : 1 si on desire calculer c2,2 si on desire
c                   calculer c2y,c2u
c        tob      : instants de mesure
c        obs      : matrice d'observation
c        cof      : coefficients de ponderation du cout
c        ytob     : valeur de l'etat aux instants d'observation
c        ob       : mesures
c        u(nu)    : controle.Le controle variable est stocke a la
c                   suite du controle suite du constant.
c       Parametres de sortie :
c        indc     : comme pour icsec1
c        c2       : cout
c        c2y(ny,ntob) : derivee de c2 par rapport a y
c        g(nu)  : derivee de c2 par rapport a u
c
c      -Etat initial (s'il est variable)
c       icsei(indi,nui,ui,y0,y0ui,itu,dtu,
c     & t0,tf,dti,dtf,ermx,iu,nuc,nuv,ilin,nti,ntf,ny,nea,
c     & itmx,nex,nob,ntob,ntobi,nitu,ndtu)
c       Parametres d'entree :
c        indi     : 1 si on desire calculer y0, 2 si on  desire
c                     calculer y0ui
c        nui      : dimension du tableau ui defini ci-dessous,
c        ui       : partie du controle intervenant dans l'etat initial,
c                   determinee par iu;vaut uc,uv,ou [uc,uv].
c
c       Parametres de sortie :
c        indc     : >0  si le calcul  s'est correctement effectue,<=0
c                   sinon,
c        y0       : etat initial,
c        y0ui     : derivee de l'etat initial par rapport au controle.
c
c
c
c!vue d'ensemble
c         Pour  utiliser la  subroutine icse, il faut  disposer d'un
c     optimiseur (code d'implementation d'un algorithme d'optimisation)
c     a  la norme  MODULOPT.Il  faut  ensuite  ecrire  le  programme
c     principal, constitue de quatre parties :
c       1. Initialisation des variables du common icsez,
c       2. Initialisation des tableaux itv et dtv et du common nird,
c       3. Appel de l'optimiseur,
c       4. Traitement des resultats.
c
c
c     1. INITIALISATION DU COMMON ICSEZ
c        common/icsez/t0,tf,dti,dtf,ermx,iu,nuc,nuv,ilin,nti,ntf,ny,nea,
c        itmx,nex,nob,ntob,ntobi,nitu,ndtu
c
c       Liste des variables a initialiser :
c       t0    : instant initial
c       tf    : instant final
c       dti   : premier pas de temps
c       dtf   : second pas de temps
c       ermx  : test d'arret absolu sur la valeur du  second membre
c               dans la resolution de l'equation d'etat
c       iu(5) : tableau  parametrant le  probleme : seuls iu(1:3)
c               sont utilises.
c            iu(1)=1 si l'etat initial depend du  controle constant
c                  0 sinon
c            iu(2)=1 si l'etat initial  depend du controle variable
c                  0 sinon
c            iu(3)=1 si le second membre depend du controle constant,
c                  0 sinon
c
c       nuc   : dimension du controle constant.
c       nuv   : dimension du controle variable a un instant donne.
c       ilin  : indicateur de linearite
c       nti   : nombre de pas de temps correspondant a dti (premier
c                 pas de temps)
c       ntf   : nombre de pas  de temps correspondant a dtf (second
c               pas de temps)
c       ny    : dimension de l'etat a un instant donne
c       nea   : nombre d'equations algebriques (eventuellement nul)
c       itmx  : nombre  maximal  d'iterations dans la resolution
c               de l'equation d'etat discrete a un pas de temps
c               donne
c       nex   : nombre d'experiences effectuees
c       nob   : dimension du  vecteur des mesures  pour une
c               experience donnee en un instant donne
c       ntob  : nombre d'instants de mesure pour une experience donnee
c       ntobi : nombre d'instants de mesure correspondant a dti
c               (premier pas de temps)
c       nitu  : longueur de  itu,tableau de  travail entier reserve
c               a l'utilisateur
c       ndtu  : longueur de dtu,  tableau de travail  double
c               precision reserve a l'utilisateur
c       u(nu)       : parametres initiaux
c       y0(ny)      : etat initial
c       tob(ntob)   : instants de mesure
c       binf(nu)    : borne inferieures sur les parametres
c       bsup(nu)    : borne superieures sur les parametres
c       obs(nob,ny) : matrice d'observation
c
c     Bien noter que
c         nu = nuc + nuv*(nti+ntf+1),
c         nui= iu(1)*nuc+ui(2)*nuv*(nti+ntf+1)
c     et que les dimensions suivantes peuvent etre nulles :
c         nuc,nuv,ntf,nea.
c
c
c     2 INITIALISATION DES TABLEAUX ENTIER ET DOUBLE PRECISION.
c       Le tableau itv (entier) contient le tableau :
c       itu    dimension nitu      : reserve a l'utilisateur,
c     le reste du tableau etant reserve au systeme ICSE.
c
c     Le tableau dtv (reel double precision) contient les tableaux :
c       dtu    dimension  ndtu     : reserve a l'utilisateur,
c       y0                ny       : etat initial,
c       tob               ntob     : instants d'observation,
c       obs               nob,ny   : matrice d'observation,
c       ob            nex,ntob,nob : observations (mesures),
c       ech               nu       : coefficients de mise a l'echelle de
c                                    u,
c       cof              nob,ntob  : coefficients de ponderation du
c                                    cout,
c
c       Les dimensions nitu et ndtu sont passees par le common icsez,
c                      nitv et ndtv sont passees par le common nird.
c
c
c!
c     Copyright INRIA
      implicit double precision (a-h,o-z)
      real rtv
      dimension u(nu),g(nu),itv(*),rtv(*),dtv(*),iu(5)
      external icsef,icsec2,icsei
c
      common/icsez/ t0,tf,dti,dtf,ermx,iu,nuc,nuv,ilin,nti,ntf,ny,nea,
     &itmx,nex,nob,ntob,ntobi,nitu,ndtu
      common/nird/nitv,nrtv,ndtv
c
c
c     lui et nui servent quand l'etat initial depend du controle
      if (iu(2).gt.0) lui=min(nu,1+nuc)
      if (iu(1).gt.0) lui=1
      nui=iu(1)*nuc+iu(2)*nuv*(nti+ntf+1)
c
c     decoupage de itv
c     nitu longueur de itu tableau de travail entier reserve
c     a l'utilisateur
c     nitvt longueur de itvt tableau de travail entier de
c     icse1 et icse2
c
      litu=1
      litvt=litu+nitu
c
c     decoupage de dtv
c     ndtu longueur de dtu tableau de travail double precision
c     reserve a l'utilisateur
c     ndtvt longueur de dtvt tableau de travail double precision
c     de icse1 et icse2
c
      ldtu=1
      ly0=ldtu+ndtu
      ltob=ly0+ny
      lobs=ltob+ntob
      lob=lobs+nob*ny
      lech=lob+nex*ntob*nob
      lcof=lech+nu
c       ********************** Modif 88
      lb=lcof+nob*ntob
      lfy=lb+ny
      lfu=lfy+ny*ny
      ludep=lfu+ny*(nuc+nuv)
      lytot=ludep+nu
      lf=lytot+ny*(nti+ntf)
      ldtvt=lf+ny
c
c     decoupage de itvt pour icse1
c
      lipv1=litvt
      mitv1=lipv1+ny-1
c
c     decoupage de itvt pour icse2
c
      litob=litvt
      lipv2=litob+ntob
      mitv2=lipv2+ny-1
c
      mitv=max(mitv1,mitv2)
c
c     decoupage de dtvt pour icse1
c
      ldm=ldtvt
      lyold=ldm+ny*ny
      lsmold=lyold+ny
      lyint=lsmold+ny
      lyerr=lyint+ny
      ldif1=lyerr+ny
      ldif2=ldif1+ny
      ldif3=ldif2+ny
      mdtv1=ldif3+ny-1
c
c     decoupage de dtvt pour icse2
c
      lytob=ldtvt
      lc2y=lytob+ny*ntob
      ly0u=lc2y+ny*ntob
      ldmy=ly0u+ny*nu
      lsmy=ldmy+ny*ny
      loldmu=lsmy+ny*ny
      ly=loldmu+ny*(nuc+nuv)
      loldp=ly+ny
      lp=loldp+ny
      lp0=lp+ny
      lgt=lp0+ny
      lyob=lgt+max(nuc+nuv,nui)
      ld=lyob+nob*ntob
      mdtv2=ld+nob-1
c
      mdtv=max(mdtv1,mdtv2)
      if (mitv.gt.nitv.or.mdtv.gt.ndtv) then
        if (nitv+ndtv.gt.0) write(*,8003) mitv,mdtv
        nitv=mitv
        ndtv=mdtv
        return
      endif
      do 10 i=1,nu
      dtv(ludep+i-1)=u(i)
      u(i)=dtv(lech+i-1)*u(i)
10    continue
c
c     etat initial dependant du controle
c
      if (iu(1).gt.0) then
        indi=1
        call icsei(indi,nui,u(lui),dtv(ly0),dtv(ly0u),
     &    itv(litu),dtv(ldtu),
     & t0,tf,dti,dtf,ermx,iu,nuc,nuv,ilin,nti,ntf,ny,nea,
     & itmx,nex,nob,ntob,ntobi,nitu,ndtu)
        if (indi.le.0) then
           ind=indi
           return
        endif
      endif
c
c appel de icse1
c but
c     icse1 resout les systemes dynamiques du type:
c        0=fi(t,y,u),i<=nea et dyj/dt=fj(t,y,u),nea<j<=ny pour t>=t0
c        et y(t0)=y0,en notant ny la dimension de l'etat y et
c        fk la keme composante de la fonction f
c algorithme
c
c     on procede a pas de temps constant:dt suivant deux echelles
c     apres p pas,on a obtenu y_p valeur de l'etat a l'instant t_p
c     soit y_p= (y_p(1),....,y_p(ny))
c     on veut calculer d(y_p)=y_p+1-y_p
c     on note dt=t_(p+1)-t_p et I la matrice diagonale d'ordre ny
c     dont les nea premiers coefficients diagonaux valent 0 et les
c     autres 1.
c
c     prediction:
c     I*d(0,y_p)=dt f(t_p,y_p,u)
c
c     correction:
c     apres q corrections,on approche l'egalite souhaitee:
c     (1/dt)I*d(q+1,y_p)=(1/2)[I*f(t_p,y_p,u)+f(t_p+1,y_p+d(q+1,y_p),u)]
c     par:
c     (1/dt)I*d(q+1,y_p)=(1/2)dfy(t_p,y_p,u)dqp+
c            (1/2)[I*f(t_p,y_p,u)+f(t_p+1,y_p+d(q+1,y_p),u)]
c        en notant dqp=d(q+1,y_p)-d(q,y_p)
c     soit par:
c        ((1/dt)I-(1/2)dfy(t_p,y_p,u))dqp=
c        (1/2)[I*f(t_p,y_p,u)+f(t_p+1,y_p+d(q,y_p),u)]-(1/dt)d(q,y_p)
c
c     on retient d(y_p)=d(q0,y_p),ou q0 est le premier entier non nul
c     tel que la norme l2 de:(1/2)[I*f(t_p,y_p,u)+
c                            f(t_p+1,y_p+d(q0,y_p),u)]-(1/dt)d(q0,y_p)
c     est inferieure a ermx
c     de plus le nombre des corrections ne doit pas depasser:
c     itmx
c
c remarque:
c     L'erreur de discretisation est en O(dt**2) dans cette methode
c     car l'erreur e commise a chaque pas dt est en (dt**3),et si
c     l'on prend dt'=(1/s)*dt,l'erreur e' commise a chaque pas dt'
c     est e'=(1/s**3)*e;alors pour atteindre tf=nt*dt,il faut
c     nt pas dt,d'ou l'erreur E_nt=nt*O(dt**3),et il faut s*nt pas dt'
c     d'ou l'erreur E'_nt=s*nt*e'=(1/s**2)*E_nt
c
c liste d'appel:
c     icse1(ind,nu,u,icsef,y0,ytot,f,b,fy,fu,ipv1,dm,yold,smold,yint,
c     yerr,dif1,dif2,dif3,itu,dtu,
c     t0,tf,dti,dtf,ermx,iu,nuc,nuv,ilin,nti,ntf,ny,nea,
c     itmx,nex,nob,ntob,ntobi,nitu,ndtu)
c     en entree:
c
c     ind,u,nu figurent dans la liste d'appel de icse.fortran
c
c     icsef    nom de subroutine appelee par icse1
c
c     y0         double precision (ny)
c                etat initial
c
c     b          double precision (ny)
c                terme constant dans le cas lineaire quadratique
c
c     en sortie:
c
c     ytot       double precision (ny,nti+ntf)
c                valeurs calculees de l'etat aux pas de temps
c
c     variables internes:
c
c     f          double precision (ny)
c                stockage d'un calcul inutile des seconds membres
c                (au cas ou l'on n'utiliserait pas indf)
c
c     fy         double precision (ny,ny)
c                stockage de la derivee des seconds membres
c                par rapport a l'etat
c
c     fu         double precision (ny,nuc+nuv)
c                stockage de la derivee des seconds membres
c                par rapport aux parametres
c
c     ipv1       entier (ny)
c                stockage du vecteur des indices des pivots donne par
c                dgefa a chaque factorisation du jacobien
c
c     dm         double precision (ny,ny)
c                matrices successives des systemes lineaires
c                donnant l'etat discretise
c                dm=(1/dt)I-(1/2)dfy
c
c     yold       double precision (ny)
c                valeurs calculees successives de l'etat
c
c     smold      double precision (ny)
c                stockage de I*f(yold)
c
c     yint       double precision (ny)
c                yint=yold+dif1,ou dif1 est l'ecart donne
c                par prediction
c
c     yerr       double precision (ny)
c                yerr=yold+dif3,ou dif3 est l'ecart donne
c                par correction
c
c     dif1       double precision (ny)
c                ecart donne par prediction
c
c     dif2       double precision (ny)
c                stockage des differences entre les ecarts
c                consecutifs et des erreurs apres correction
c
c     dif3       double precision (ny)
c                ecart donne par correction
c
c     itu        entier (nitu)
c                tableau de travail entier reserve a l'utilisateur
c
c     dtu        double precision (ndtu)
c                tableau de travail double precision reserve
c                a l'utilisateur
c
c     enfin:
c
c     kt         entier
c                indice de comptage des pas de temps
c
c     dt         double precision
c                pas de temps,egal a dti ou a dtf
c
c     dtinv      double precision
c                dtinv=1/dt
c
c     t          double precision
c                instant(a l'instant t on travaille sur [t-dt,t])
c
c     told       double precision
c                instant anterieur a t:told=t-dt
c
c     indf       entier
c                indicateur figurant dans la liste d'appel de icsef
c
c     it         entier
c                indice de comptage des corrections
c
c     err        double precision
c                norme l2 de dif2
c
      call icse1(ind,nu,u,icsef,dtv(ly0),dtv(lytot),dtv(lf),dtv(lb),
     &dtv(lfy),dtv(lfu),itv(lipv1),dtv(ldm),dtv(lyold),dtv(lsmold),
     &dtv(lyint),dtv(lyerr),dtv(ldif1),dtv(ldif2),dtv(ldif3),
     &itv(litu),dtv(ldtu),
     &t0,tf,dti,dtf,ermx,iu,nuc,nuv,ilin,nti,ntf,ny,nea,
     &itmx,nex,nob,ntob,ntobi,nitu,ndtu)
c
      if (ind.le.0) return
c
c appel de icse2
c but
c     icse2 calcule le gradient du cout en utilisant l'etat
c     adjoint du systeme discretise
c algorithme
c     On procede a pas de temps constant:dt suivant deux echelles
c     si nt est le nombre total de pas de temps,notons:
c     y_1,...,y_nt les valeurs de la variable d'etat y a chaque pas
c     p_1,...,p_nt l'etat adjoint discretise
c     avec pour tout l=1,...,nt
c     y_l=(y_l(1),...,y_l(ny)) et p_l=(p_l(1),...,p_l(ny))
c     c2 la fonction cout
c     Id la matrice identite d'ordre ny
c     I la matrice diagonale d'ordre ny dont les nea premiers
c       coefficients diagonaux valent 0 et les autres 1
c     (M)t la transposee de la matrice M
c     L'etat adjoint discretise est la solution du systeme:
c        dc2/dy_nt=(I-(dt/2)dfy(t_nt,y_nt,u))t*p_nt avec
c                  dt=t_nt-t_(nt-1)
c        dc2/dy_k+(Id+(dt/2)dfy(t_k,y_k,u))t*I*p_k+1=
c        (I-(dt2new)dfy(t_k,y_k,u))t*p_k pour k=1,...,nt-1
c        avec dc2/dy_l nul quand l n'est pas un indice d'instant de
c        mesure
c     A chaque pas,apres avoir calcule p_l,on calcule
c     la contribution au gradient au pas l+1:
c     (dt/2)(dfu(t_l,y_l,u)+dfu(t_l+1,y_l+1,u))t*p_(l+1)) avec
c     dt=t_(l+1)-t_l
c     qu'on ajoute pour obtenir finalement le gradient en prenant
c     si l=1 la contribution:
c     ((t_1-t0)/2)(dfu(t0,y0,u)+dfu(t_1,y_1,u))t*p_1.
c     L'etat adjoint n'est pas stocke.
c
c liste d'appel:
c     icse2(ind,u,nu,co,g,icsef,icsec2,icsei,y0,tob,obs,ob,ytot,f,b,
c     fy,fu,ipv2,itob,cof,ytob,c2y,y0u,dmy,smy,oldmu,y,oldp,p,p0,gt,
c     yob,d,itu,dtu,
c     t0,tf,dti,dtf,ermx,iu,nuc,nuv,ilin,nti,ntf,ny,nea,
c     itmx,nex,nob,ntob,ntobi,nitu,ndtu)
c     en entree:
c
c     ind,u,nu   figurent dans la liste d'appel de icse.fortran
c
c     icsef      nom de subroutine appelee par icse2
c
c     icsec2     nom de subroutine appelee par icse2
c
c     icsei      nom de subroutine appelee par icse2
c
c     y0         double precision (ny)
c                etat initial
c
c     tob        double precision (ntob)
c                instants de mesure
c
c     obs        double precision (nob,ny)
c                matrice d'observation
c                figure dans la liste d'appel de icsec2,qui calcule
c                le cout quadratique dans le cas d'un observateur
c                lineaire
c
c     ob         double precision (nex,ntob,nob)
c                mesures
c
c     ytot       double precision (ny,nti+ntf)
c                valeurs calculees de l'etat aux pas de temps
c
c     b          double precision (ny)
c                terme constant dans le cas lineaire quadratique
c
c     en sortie:
c
c     co,g       figurent dans la liste d'appel de icse.fortran
c
c     variables internes:
c
c     f          double precision (ny)
c                stockage d'un calcul inutile des seconds membres
c                (au cas ou l'on n'utiliserait pas indf)
c
c     fy         double precision (ny,ny)
c                stockage de la derivee des seconds membres
c                par rapport a l'etat
c
c     fu         double precision (ny,nuc+nuv)
c                stockage de la derivee des seconds membres
c                par rapport aux parametres
c
c     ipv2       entier (ny)
c                stockage du vecteur des indices des pivots donne par
c                dgefa a chaque factorisation du jacobien
c
c     itob       entier (ntob)
c                indices des instants de mesure
c
c     cof        double precision (nob,ntob)
c                coefficients de ponderation du cout
c
c     ytob       double precision (ny,ntob)
c                valeurs calculees de l'etat aux instants de mesure
c
c     y0u        double precision (ny,nui)
c                derivee de l'etat initial par rapport au controle
c
c     dmy        double precision (ny,ny)
c                matrices successives des systemes lineaires
c                donnant l'etat adjoint discretise
c                dmy=I-(dt/2)dfy
c
c     smy        double precision (ny,ny)
c                matrices successives conduisant aux seconds membres
c                des systemes lineaires de l'etat adjoint discretise
c
c     oldmu      double precision (ny,nuc+nuv)
c                stockage de df/du a l'instant posterieur
c
c     y          double precision (ny)
c                stockage de la valeur calculee de l'etat a un pas de
c                temps
c
c     oldp       double precision (ny)
c                stockage de la valeur calculee de l'etat adjoint au
c                pas de temps posterieur
c
c     p          double precision (ny)
c                stockage de la valeur calculee de l'etat adjoint a
c                un pas de temps
c
c     p0         double precision (ny)
c                etape dans le calcul des seconds membres des
c                systemes lineaires donnant l'etat adjoint dicretise
c
c     gt         double precision (nu)
c                stockage de la contribution au gradient a chaque
c                pas de temps
c
c     yob,d      figurent dans la liste d'appel de icsec2,qui calcule
c                le cout quadratique dans le cas d'un observateur
c                lineaire
c
c     itu        entier (nitu)
c                tableau de travail entier reserve a l'utlisateur
c
c     dtu        double precision (ndtu)
c                tableau de travail double precision reserve
c                a l'utilisateur
c
c     enfin:
c
c     kt         entier
c                indice de comptage des pas de temps
c
c     ktob       entier
c                indice de comptage des instants de mesure
c
c     dt         double precision
c                pas de temps,egal a dti ou a dtf
c
c     dt2        double precision
c                dt2=dt/2
c
c     dt2new      double precision
c                dt2 a l'instant posterieur
c
c     t          double precision
c                instant (a l'instant t on travaille sur [t,t+dt])
c
c     c2         double precision
c                stockage d'un calcul inutile du cout
c                (au cas ou l'on n'utiliserait pas indc)
c
c     indf       entier
c                indicateur figurant dans la liste d'appel de icsef
c
c     indi       entier
c                indicateur figurant dans la liste d'appel de icsei
c
c     nui        entier
c                nombre de parametres dont depend l'etat initial
c                (figure dans la liste d'appel de icsei)
c
      call icse2(ind,nu,u,co,g,icsef,icsec2,icsei,dtv(ly0),dtv(ltob),
     &dtv(lobs),dtv(lob),dtv(lytot),dtv(lf),dtv(lb),dtv(lfy),dtv(lfu),
     &itv(lipv2),itv(litob),dtv(lcof),dtv(lytob),dtv(lc2y),dtv(ly0u),
     &dtv(ldmy),dtv(lsmy),dtv(loldmu),dtv(ly),dtv(loldp),
     &dtv(lp),dtv(lp0),dtv(lgt),dtv(lyob),dtv(ld),itv(litu),dtv(ldtu),
     &t0,tf,dti,dtf,ermx,iu,nuc,nuv,ilin,nti,ntf,ny,nea,
     &itmx,nex,nob,ntob,ntobi,nitu,ndtu)
      do 20 i=1,nu
      g(i)=dtv(lech+i-1)*g(i)
      u(i)=dtv(ludep+i-1)
20    continue
      return
c
c format
c
 8003 format(1x,'icse : taille des tableaux itv,dtv insuffisante',/,
     +       8x,'valeurs minimales ',i6,2x,i6)
c
c fin
c
      end