Skip to content

Commit

Permalink
Merge pull request #344 from itesla/update_ampl_files
Browse files Browse the repository at this point in the history
Update AMPL scripts with hvdc and svc support
  • Loading branch information
sylvlecl committed Jun 8, 2018
2 parents e6b6fc4 + e83145e commit 6158142
Show file tree
Hide file tree
Showing 4 changed files with 248 additions and 29 deletions.
17 changes: 15 additions & 2 deletions case-projector/src/main/resources/ampl/projector/projector.dat
Expand Up @@ -42,7 +42,6 @@ param: TAPS: tap_ratio tap_x tap_angle tap_fault tap_curative := include ampl_ne
#param: REGL: regl_tap0 regl_table regl_onLoad regl_V regl_fault regl_curative regl_id := include ampl_network_rtc.txt;
param: REGL: regl_tap0 regl_table regl_onLoad regl_V regl_fault regl_id := include ampl_network_rtc.txt;


# ampl_network_ptc.txt
#"num" "tap" "table" "fault" "curative" "id"
param: DEPH: deph_tap0 deph_table deph_fault deph_curative deph_id := include ampl_network_ptc.txt;
Expand All @@ -51,11 +50,25 @@ param: DEPH: deph_tap0 deph_table deph_fault deph_curative deph_id := include am
#"num" "bus1" "bus2" "3wt num" "sub.1" "sub.2" "r (pu)" "x (pu)" "g1 (pu)" "g2 (pu)" "b1 (pu)" "b2 (pu)" "cst ratio (pu)" "ratio tc" "phase tc" "p1 (MW)" "p2 (MW)" "q1 (MVar)" "q2 (MVar)" "patl1 (A)" "patl2 (A)" "merged" "fault" "curative" "id" "description"
param: QUAD: quad_3wt quad_subor quad_subex quad_R quad_X quad_Gor quad_Gex quad_Bor quad_Bex quad_cstratio quad_ptrRegl quad_ptrDeph quad_Por quad_Pex quad_Qor quad_Qex quad_patl1 quad_patl2 quad_merged quad_fault quad_curative quad_id quad_nom := include ampl_network_branches.txt;

# ampl_network_static_var_compensators.txt
#"num" "bus" "con. bus" "substation" "minB (S)" "maxB (S)" "v regul." "targetV (pu)" "fault" "curative" "id" "description" "P (MW)" "Q (MVar)"
param: SVC: svc_noeudpossible svc_substation svc_bmin svc_bmax svc_vregul svc_targetV svc_fault svc_curative svc_id svc_description svc_P0 svc_Q0 := include ampl_network_static_var_compensators.txt;

#ampl_network_hvdc.txt
#"num" "type" "converterStation1" "converterStation2" "r(ohm)" "nomV(KV)" "convertersMode" "targetP(MW)" "maxP(MW)" "fault" "curative" "id" "description"
param: HVDC: hvdc_type hvdc_conv1 hvdc_conv2 hvdc_r hvdc_Vnom hvdc_convertersMode hvdc_targetP hvdc_Pmax hvdc_fault hvdc_curative hvdc_id hvdc_description := include ampl_network_hvdc.txt;

#ampl_network_vsc_converter_stations.txt
#"num" "bus" "con. bus" "substation" "minP(MW)" "maxP(MW)" "minQmaxP(MVar)" "minQ0(MVar)" "minQminP(MVar)" "maxQmaxP(MVar)" "maxQ0(MVar)" "maxQminP(MVar)" "v regul." "targetV(pu)" "targetQ(MVar)" "lossFactor(%PDC)" "fault" "curative" "id" "description" "P(MW)" "Q(MVar)"
param: VSCCONV: vscconv_noeudpossible vscconv_substation vscconv_Pmin vscconv_Pmax vscconv_qP vscconv_qp0 vscconv_qp vscconv_QP vscconv_Qp0 vscconv_Qp vscconv_vregul vscconv_targetV vscconv_targetQ vscconv_lossFactor vscconv_fault vscconv_curative vscconv_id vscconv_description vscconv_P0 vscconv_Q0 := include ampl_network_vsc_converter_stations.txt;


# ampl_generators_domains.txt
#num id P(MW) Q(MVar) V(kV) RHS(lt) Vnominal(kV) id_internal
param: DOMAIN: domain_coeffP domain_coeffQ domain_coeffV domain_RHS domain_Vnomi domain_idinternal := include ampl_generators_domains.txt;

# ampl_network_limits.txt
#"num" "branch" "side" "limit (A)" "accept. duration (s)" "fault" "curative"
# Fichier non lu
# Fichier non lu par le porjecteur


209 changes: 189 additions & 20 deletions case-projector/src/main/resources/ampl/projector/projector.mod
Expand Up @@ -21,6 +21,15 @@
param tempo;


###############################################################################
#
# Autres parametres
#
###############################################################################
param epsilon_tension_min = 0.5; # On considere qu'une Vmin ou Vmax < 0.5 ne vaut rien (exemple -99999)



###############################################################################
# Donnees postes
###############################################################################
Expand Down Expand Up @@ -172,6 +181,32 @@ check {(s,n) in SHUNT}: n in NOEUD union {-1};
check {(s,n) in SHUNT}: shunt_substation[s,n] in SUBSTATIONS;


###############################################################################
# Donnees Static Var Compensator (== CSPR)
###############################################################################

set SVC dimen 2; # [svc, noeud]
param svc_noeudpossible {SVC} integer;
param svc_substation {SVC} integer;
param svc_bmin {SVC}; # Susceptance B en p.u. : faire B*100*V^2 pour obtenir des MVAr
param svc_bmax {SVC}; # Susceptance B en p.u. : faire B*100*V^2 pour obtenir des MVAr
param svc_vregul {SVC} symbolic; # Indique si le svc est en mode de regulation de la tension
param svc_targetV {SVC}; # Cible pour la regulation de tension
param svc_fault {SVC};
param svc_curative {SVC};
param svc_id {SVC} symbolic;
param svc_description {SVC} symbolic;
param svc_P0 {SVC};
param svc_Q0 {SVC}; # Valeur fixe a utiliser si le svc ne regule pas la tension (e-mail Nicolas Omont 30 mai 2018)

#
# Consistance
#
check {(s,n) in SVC}: n in NOEUD union {-1};
check {(s,n) in SVC}: svc_substation[s,n] in SUBSTATIONS;



###############################################################################
# Donnees Tables des prises
###############################################################################
Expand Down Expand Up @@ -293,6 +328,68 @@ param noeud_Ytot {k in NOEUD} =
);# Fin de la somme


###############################################################################
# Donnees stations de conversion de type VSC / VSC converter station data
###############################################################################
set VSCCONV dimen 2; # num, bus
param vscconv_noeudpossible{VSCCONV} integer;
param vscconv_substation {VSCCONV} integer;
param vscconv_Pmin {VSCCONV};
param vscconv_Pmax {VSCCONV};
param vscconv_qP {VSCCONV};
param vscconv_qp0 {VSCCONV};
param vscconv_qp {VSCCONV};
param vscconv_QP {VSCCONV};
param vscconv_Qp0 {VSCCONV};
param vscconv_Qp {VSCCONV};
param vscconv_vregul {VSCCONV} symbolic;
param vscconv_targetV {VSCCONV};
param vscconv_targetQ {VSCCONV};
param vscconv_lossFactor {VSCCONV};
param vscconv_fault {VSCCONV};
param vscconv_curative {VSCCONV};
param vscconv_id {VSCCONV} symbolic;
param vscconv_description {VSCCONV} symbolic;
param vscconv_P0 {VSCCONV};
param vscconv_Q0 {VSCCONV};

#
# Consistance
#
check {(cs,n) in VSCCONV}: n in NOEUD union {-1};
check {(cs,n) in VSCCONV}: vscconv_substation[cs,n] in SUBSTATIONS;
check {(cs,n) in VSCCONV}: vscconv_Pmin[cs,n] <= vscconv_Pmax[cs,n];
check {(cs,n) in VSCCONV}: vscconv_qp[cs,n] <= vscconv_Qp[cs,n]; # Qmin et Qmax a Pmin
check {(cs,n) in VSCCONV}: vscconv_qp0[cs,n] <= vscconv_Qp0[cs,n]; # Qmin et Qmax a P=0
check {(cs,n) in VSCCONV}: vscconv_qP[cs,n] <= vscconv_QP[cs,n]; # Qmin et Qmax a Pmax
check {(cs,n) in VSCCONV: vscconv_vregul[cs,n] == "true"}: vscconv_targetV[cs,n] >= epsilon_tension_min;


###############################################################################
# Donnees HVDC
# Rq: si on utilise les injections des stations VSC fixes, les donnees de la hvdc ne sont pas utilisees
###############################################################################
set HVDC dimen 1;
param hvdc_type {HVDC} integer; # 1->vscConverterStation, 2->lccConverterStation
param hvdc_conv1 {HVDC} integer;
param hvdc_conv2 {HVDC} integer;
param hvdc_r {HVDC};
param hvdc_Vnom {HVDC};
param hvdc_convertersMode {HVDC} symbolic;
param hvdc_targetP {HVDC};
param hvdc_Pmax {HVDC};
param hvdc_fault {HVDC};
param hvdc_curative {HVDC};
param hvdc_id {HVDC} symbolic;
param hvdc_description {HVDC} symbolic;

check {h in HVDC}: hvdc_type[h] == 1; # Doit valoir 1 ou 2 mais le type 2 n'est pas encore developpe ici
check {h in HVDC}: hvdc_conv1[h] != hvdc_conv2[h];
check {h in HVDC}: hvdc_Vnom[h] >= epsilon_tension_min;
check {h in HVDC}: hvdc_convertersMode[h] == "SIDE_1_RECTIFIER_SIDE_2_INVERTER" or hvdc_convertersMode[h] == "SIDE_1_INVERTER_SIDE_2_RECTIFIER";
check {h in HVDC}: hvdc_targetP[h] >= 0.0;
check {h in HVDC}: hvdc_targetP[h] <= hvdc_Pmax[h];


###############################################################################
# Definition d'ensembles supplementaires
Expand Down Expand Up @@ -377,7 +474,7 @@ param quad_dephex {(qq,m,n) in QUADCC} = 0;
# Bornes en tension
###############################################################################

param epsilon_tension_min = 0.5; # On considere qu'une Vmin ou Vmax < 0.5 ne vaut rien (exemple -99999)
#param epsilon_tension_min = 0.5; # On considere qu'une Vmin ou Vmax < 0.5 ne vaut rien (exemple -99999)
param Vmin_defaut_horsgroupe := 0.80;
param Vmax_defaut_horsgroupe := 1.15;
param Vmin_defaut_groupe := 0.95;
Expand Down Expand Up @@ -468,6 +565,7 @@ check{(g,n) in UNITCC} : Qmin[g,n] <= Qmax[g,n];
set UNITHORSPMIN := setof {(g,n) in UNITCC : unit_Pc[g,n] < unit_Pmin[g,n]} unit_id[g,n] ;
set UNITHORSPMAX := setof {(g,n) in UNITCC : unit_Pc[g,n] > unit_Pmax[g,n]} unit_id[g,n];


###############################################################################
# Variables de production
###############################################################################
Expand Down Expand Up @@ -495,6 +593,62 @@ subject to ctr_domain{(numero,g,n,gid) in UNIT_DOMAIN_CTR : gen_vnom_mismatch[g,
<= domain_RHS[numero,gid];


###############################################################################
# Static Var Compensators (==CSPR)
###############################################################################

# SVC sur la composante connexe principale
set SVCCC := {(s,n) in SVC : n in NOEUDCC};

# SVC qui regulent une tension
set SVC_V := {(s,n) in SVCCC : svc_vregul[s,n]=="true" && svc_targetV[s,n] >= epsilon_tension_min };

# SVC qui regulent une valeur reactive
# Mai 2018 : donnees pas encore disponibles pour le reglage d'une consigne reactive
set SVC_Q dimen 2; # Vide

# SVC avec Q fixe
set SVC_FIXE := {(s,n) in SVCCC : (s,n) not in SVC_V};# && (s,n) not in SVC_Q};


# Variable "b" dans ses bornes
var svc_b{(s,n) in SVC_V} >= svc_bmin[s,n], <= svc_bmax[s,n];

# Dans Hades, la production de reactif est limitee par bmin*Vnominale^2 et bmax*Vnominale^2. On veut garder ces limitations ici.
subject to limites_reactif_hades{(s,n) in SVC_V}:
svc_bmin[s,n] <= svc_b[s,n] * V[n]^2 <= svc_bmax[s,n]; # Vnominale est egale a 1kV


###############################################################################
# Stations de conversion VSC
###############################################################################

# Injection active de la station de conversion VSC
var vscconv_P{(sc,n) in VSCCONV} >= vscconv_Pmin[sc,n], <= vscconv_Pmax[sc,n];

# Injection reactive de la station de conversion VSC
var vscconv_Q{(sc,n) in VSCCONV}
>= min( vscconv_qp[sc,n], vscconv_qp0[sc,n], vscconv_qP[sc,n] ),
<= max( vscconv_Qp[sc,n], vscconv_Qp0[sc,n], vscconv_QP[sc,n] );

# Diagrammes : contraintes trapezoidales reliant P et Q
# La forme generale des droites definissant le diagramme est: Q=q1+*(q2-q1)/(p2-p1)*P
# S'il s'agit d'une limite superieure, on remplace = par <=
# S'il s'agit d'une limite inferieure, on remplace = par >=

# Limites entre P=0 et Pmax
subject to limites_sup_reactif_Ppositif{(sc,n) in VSCCONV}:
vscconv_Q[sc,n] <= vscconv_Qp0[sc,n] + (vscconv_QP[sc,n]-vscconv_Qp0[sc,n])/(vscconv_Pmax[sc,n]-0.0)*vscconv_P[sc,n];
subject to limites_inf_reactif_Ppositif{(sc,n) in VSCCONV}:
vscconv_Q[sc,n] >= vscconv_qp0[sc,n] + (vscconv_qP[sc,n]-vscconv_qp0[sc,n])/(vscconv_Pmax[sc,n]-0.0)*vscconv_P[sc,n];

# Limites entre Pmin et P=0
subject to limites_sup_reactif_Pnegatif{(sc,n) in VSCCONV}:
vscconv_Q[sc,n] <= vscconv_Qp0[sc,n] + (vscconv_Qp[sc,n]-vscconv_Qp0[sc,n])/(vscconv_Pmin[sc,n]-0.0)*vscconv_P[sc,n];
subject to limites_inf_reactif_Pnegatif{(sc,n) in VSCCONV}:
vscconv_Q[sc,n] >= vscconv_qp0[sc,n] + (vscconv_qp[sc,n]-vscconv_qp0[sc,n])/(vscconv_Pmin[sc,n]-0.0)*vscconv_P[sc,n];


###############################################################################
# Transits
###############################################################################
Expand Down Expand Up @@ -552,27 +706,37 @@ var term_bilan_P_noeud_nul{k in NOEUDCC} =
# Sauf si gros probleme numerique, il faut mettre shunt_noeud[k] * V[k]^2

subject to bilan_Q_noeud {k in NOEUDCC}:
- 100 * noeud_Ytot[k] * V[k]^2
- sum{(shunt,k) in SHUNTCC} 100 * shunt_valnom[shunt,k] * V[k]^2
+ sum{(qq,k,n) in QUADCC} 100 * V[k] * Red_Tran_Rea_Dir[qq,k,n]
+ sum{(qq,m,k) in QUADCC} 100 * V[k] * Red_Tran_Rea_Inv[qq,m,k]
- sum{(g,k) in UNITCC} unit_Q[g,k]
=
- sum{(c,k) in CONSOCC} conso_QFix[c,k];
- 100 * noeud_Ytot[k] * V[k]^2
- sum{(shunt,k) in SHUNTCC } 100 * shunt_valnom[shunt,k] * V[k]^2
- sum{(svc,k) in SVC_V } 100 * svc_b[svc,k] * V[k]^2
- sum{(svc,k) in SVC_FIXE} svc_Q0[svc,k]
- sum{(sc,k) in VSCCONV } vscconv_Q[sc,k]
+ sum{(qq,k,n) in QUADCC} 100 * V[k] * Red_Tran_Rea_Dir[qq,k,n]
+ sum{(qq,m,k) in QUADCC} 100 * V[k] * Red_Tran_Rea_Inv[qq,m,k]
- sum{(g,k) in UNITCC} unit_Q[g,k]
=
- sum{(c,k) in CONSOCC} conso_QFix[c,k];

var term_bilan_Q_noeud {k in NOEUDCC} =
- 100 * noeud_Ytot[k] * V[k]^2
- sum{(shunt,k) in SHUNTCC} 100 * shunt_valnom[shunt,k] * V[k]^2
+ sum{(qq,k,n) in QUADCC} 100 * V[k] * Red_Tran_Rea_Dir[qq,k,n]
+ sum{(qq,m,k) in QUADCC} 100 * V[k] * Red_Tran_Rea_Inv[qq,m,k]
- sum{(g,k) in UNITCC} unit_Q[g,k];
- 100 * noeud_Ytot[k] * V[k]^2
- sum{(shunt,k) in SHUNTCC } 100 * shunt_valnom[shunt,k] * V[k]^2
- sum{(svc,k) in SVC_V } 100 * svc_b[svc,k] * V[k]^2
- sum{(svc,k) in SVC_FIXE} svc_Q0[svc,k]
- sum{(sc,k) in VSCCONV } vscconv_Q[sc,k]
+ sum{(qq,k,n) in QUADCC} 100 * V[k] * Red_Tran_Rea_Dir[qq,k,n]
+ sum{(qq,m,k) in QUADCC} 100 * V[k] * Red_Tran_Rea_Inv[qq,m,k]
- sum{(g,k) in UNITCC} unit_Q[g,k];

var term_bilan_Q_noeud_nul {k in NOEUDCC} =
- 100 * noeud_Ytot[k] * V[k]^2
- sum{(shunt,k) in SHUNTCC} 100 * shunt_valnom[shunt,k] * V[k]^2
+ sum{(qq,k,n) in QUADCC} 100 * V[k] * Red_Tran_Rea_Dir[qq,k,n]
+ sum{(qq,m,k) in QUADCC} 100 * V[k] * Red_Tran_Rea_Inv[qq,m,k]
- sum{(g,k) in UNITCC} unit_Q[g,k]
+ sum{(c,k) in CONSOCC} conso_QFix[c,k];
- 100 * noeud_Ytot[k] * V[k]^2
- sum{(shunt,k) in SHUNTCC } 100 * shunt_valnom[shunt,k] * V[k]^2
- sum{(svc,k) in SVC_V } 100 * svc_b[svc,k] * V[k]^2
- sum{(svc,k) in SVC_FIXE} svc_Q0[svc,k]
- sum{(sc,k) in VSCCONV } vscconv_Q[sc,k]
+ sum{(qq,k,n) in QUADCC} 100 * V[k] * Red_Tran_Rea_Dir[qq,k,n]
+ sum{(qq,m,k) in QUADCC} 100 * V[k] * Red_Tran_Rea_Inv[qq,m,k]
- sum{(g,k) in UNITCC} unit_Q[g,k]
+ sum{(c,k) in CONSOCC} conso_QFix[c,k];


###############################################################################
Expand All @@ -582,4 +746,9 @@ var term_bilan_Q_noeud_nul {k in NOEUDCC} =
minimize somme_ecarts_quadratiques :
sum {(g,n) in UNIT_PQV} ( unit_P[g,n] - unit_Pc[g,n] )^2
+ sum {(g,n) in UNIT_PQV} ( unit_Q[g,n] - unit_Qc[g,n] )^2
+ 10 * sum {(g,n) in UNIT_PV inter UNIT_PQV } ( unit_Pmax[g,n] * (V[n] - unit_Vc[g,n]) )^2;
+ 10 * sum {(g,n) in UNIT_PV inter UNIT_PQV } ( unit_Pmax[g,n] * (V[n] - unit_Vc[g,n]) )^2
+ 10 * sum {(s,n) in SVC_V } 100 * (V[n] - svc_targetV[s,n])^2 # Ici le 100 signifie qu'en general les VSC ont une capacite de l'ordre de 100MVAr
+ 1.0e+8 * sum{(sc,n) in VSCCONV} (V[n] - vscconv_targetV[sc,n])^2
;


33 changes: 29 additions & 4 deletions case-projector/src/main/resources/ampl/projector/projector.run
Expand Up @@ -112,6 +112,26 @@ let {(g,n) in UNIT} unit_QP[g,n]:=tmp[g,n];
check;



###############################################################################
# Correction des valeurs bmin et bmax des CSPR
###############################################################################
# 31 mai 2018 : les conversions pour les CSPR sont erronnees dans Powsybl, donc on doit modifier les valeurs ici
for {(s,n) in SVCCC} {
if ( abs(svc_bmin[s,n]) + abs(svc_bmax[s,n]) ) < 0.1
then {
printf "Poste %s : valeur bmin du VSC '%s' trop faible, corrigee par %f * %i^2 / 100 = %.2f\n",
substation_id[noeud_poste[n]],svc_id[s,n],svc_bmin[s,n],substation_Vnomi[noeud_poste[n]],
svc_bmin[s,n] * 0.01 * substation_Vnomi[noeud_poste[n]]^2;
printf "Poste %s : valeur bmax du VSC '%s' trop faible, corrigee par %f * %i^2 / 100 = %.2f\n",
substation_id[noeud_poste[n]],svc_id[s,n],svc_bmax[s,n],substation_Vnomi[noeud_poste[n]],
svc_bmax[s,n] * 0.01 * substation_Vnomi[noeud_poste[n]]^2;
let svc_bmin[s,n] := svc_bmin[s,n] * 0.01 * substation_Vnomi[noeud_poste[n]]^2;
let svc_bmax[s,n] := svc_bmax[s,n] * 0.01 * substation_Vnomi[noeud_poste[n]]^2;
}
}


################################################################################
# Calcul du noeud qui aura la phase fixee
################################################################################
Expand Down Expand Up @@ -166,6 +186,10 @@ fix {(g,n) in UNITCC diff UNIT_PQV} unit_Q[g,n];
# On ne peut pas en plus fixer la tension, sinon risque de non realisabilite pour question numerique (si on veut fixer P Q V en meme temps, il y a risque d'erreur numerique)


# Fonctionnement des stations de conversion HVDC mode VSC : injection fisee
fix {(sc,n) in VSCCONV} vscconv_P[sc,n] := vscconv_P0[sc,n];


###############################################################################
# Descriptifs
###############################################################################
Expand All @@ -184,7 +208,8 @@ display card(NOEUDCC),card(NOEUDCC_V0),
UNITHORSPMIN,UNITHORSPMAX,
card(UNIT_DOMAIN_CTR),
UNIT_DOMAIN,
DOMAIN_ID
DOMAIN_ID,
SVC,SVC_V,SVC_FIXE
;

printf "Nombre de noeuds dans la composante connexe pincipale (i.e. la composante connexe numero 0) : %i\n",card(NOEUDCC);
Expand Down Expand Up @@ -222,7 +247,7 @@ let {(g,n) in UNIT_PQV} ctr_trapeze_qmax[g,n].cscalefactor := 1/max(1.0,abs(ctr_
let {(g,n) in UNIT_PQV} ctr_trapeze_qmin[g,n].cscalefactor := 1/max(1.0,abs(ctr_trapeze_qmin_rhs[g,n]));
let {(numero,g,n,gid) in UNIT_DOMAIN_CTR} ctr_domain[numero,g,n,gid].cscalefactor :=
1/max(1.0,abs(domain_RHS[numero,gid]));

#let {(s,n) in SVC_V} svc_b[s,n].xscalefactor := (svc_bmax[s,n] - svc_bmin[s,n]); # Semble ralentir le calcul. A retester


###############################################################################
Expand All @@ -237,6 +262,7 @@ let {n in NOEUDCC} bilan_Q_noeud[n].cfeastol := 0.01;
let {(g,n) in UNIT_PQV} ctr_trapeze_qmax[g,n].cfeastol := 0.01;
let {(g,n) in UNIT_PQV} ctr_trapeze_qmin[g,n].cfeastol := 0.01;
let {(numero,g,n,gid) in UNIT_DOMAIN_CTR} ctr_domain[numero,g,n,gid].cfeastol := 0.01;
let {(s,n) in SVC_V} limites_reactif_hades[s,n].cfeastol := 0.001;


###############################################################################
Expand All @@ -250,9 +276,9 @@ display bilan_P_noeud,
term_bilan_Q_noeud,
term_bilan_Q_noeud_nul
> bilan_P_noeud.txt;
expand limites_sup_reactif_Ppositif,limites_inf_reactif_Ppositif,limites_sup_reactif_Pnegatif,limites_inf_reactif_Pnegatif ;
*/


###############################################################################
# Resolution
###############################################################################
Expand All @@ -272,7 +298,6 @@ repeat {
while ( ( solve_result_num >= 100 and solve_result_num < 400 ) or solve_result_num >= 410 ) and nb_solve<nb_solve_max;



###############################################################################
# Ecriture des resultats
###############################################################################
Expand Down

0 comments on commit 6158142

Please sign in to comment.