/// DiodeCurr.java
// RM0/1 gr. stud. Andrius Chaziachmetovas
//Si programa skirta diodo VACH koeficientu nustatymui 
//naudojamasi sroves priklausomybe nuo ytampos
//Diodo VACH yra aprasoma formule, kurioje yra du nezinomi koeficientai
//Optimizavimas vykdomas pagal
//absoliutine reiksme. Optimizavimo programa apskaiciuoja
//optimalius koeficientus ir juos istacius i VACH formule
//gauname optimalia diodo charakteristika ir galime geriau
//parinkti reikiama dioda


package lt.ktu.gmj.tasks;

import lt.ktu.gmj.*;
import lt.ktu.gmj.propertySheet.*;

class DiodeCurrDomain extends Domain {
 static final String []dimensions={
  "I0f",
  "rb"
 };

 public String[] dimensions ()
 { return dimensions; }

 DiodeCurrDomain ()
 {
   min[0]=0.1;
   max[0]=100;
   min[1]=1; 
   max[1]= 200;

   defaultPoint.x[0]=1;
   defaultPoint.x[1]=50;
 }

};

public class DiodeCurr extends AbstractTask implements TaskWithAnalyzers {
 private DiodeCurrDomain domain=new DiodeCurrDomain();
 public double multiplier=1;
 public int function=1;

 public void customize (PropertyManager manager)
 {
   manager.add ( new DoubleProperty("Multiplier",
                  new FieldProvider(this, "multiplier"), 0.1, 1000));
 }

 public Domain domain ()
 { return domain; }

 public double f (Point pt)
 {
   
  int i; 		
  double norma = 0;
  double[] Uf, y, If, value;                
  Uf = new double[9];        
  y = new double[9];
  If = new double[9];
  value = new double[9];
		
		
	Uf[0] = 0.32; 			If[0]=0.001;
	Uf[1] = 0.4; 			If[1]=0.01;
	Uf[2] = 0.44; 			If[2]=0.025;
	Uf[3] = 0.48;			If[3]=0.1;
	Uf[4] = 0.53;			If[4]=0.28;
	Uf[5] = 0.59; 			If[5]=1;
	Uf[6] = 0.7; 			If[6]=5;
	Uf[7] = 0.8; 			If[7]=14;
	Uf[8] = 1;			If[8]=50;
	
		
	for(i=0;i<9;i++)
		{y[i]=1000*((pt.x[0]*0.000000000001)*(Math.exp((Uf[i]-(If[i]*0.001)*pt.x[1])/0.025)-1));};
			
	norma=0;
	for(i=0;i<9;i++)
		{value[i]=Math.abs(y[i]-(If[i]));
	        norma=norma+value[i];}
	norma = norma*multiplier;
	return norma;
 }

 public Class[] analyzers () throws ClassNotFoundException
 {
   Class spectrumClass=Class.forName("lt.ktu.gmj.analysis.Spectrum");
   return new Class[]{ spectrumClass };
 }

};

