POST example#

Description#

This post computation generates a field of the tresca values for a given tensor variable.

Code Listing#

#include <Utility.h>

#include <Post_eigen.h>
#include <Post_simple.h>

ZCLASS2 POST_TRESCA :public POST_SIMPLE {
  PTR<POST_EIGEN2> lp_eigen;
  void set_eigen2();
 protected :
  int   tsz;

 public :
  POST_TRESCA();
  virtual ~POST_TRESCA();

  virtual MODIFY_INFO_RECORD* get_modify_info_record();
  virtual bool verify_info();

  virtual void input_i_need(int,ARRAY<STRING>&);
  virtual void output_i_give(bool&,ARRAY<STRING>&);
  virtual void compute(const ARRAY<VECTOR>&,ARRAY<VECTOR>&);
};

DECLARE_OBJECT(LOCAL_POST_COMPUTATION,POST_TRESCA,tresca);

POST_TRESCA::POST_TRESCA()
{ class_name="tresca";
}

POST_TRESCA::~POST_TRESCA() { }

MODIFY_INFO_RECORD* POST_TRESCA::get_modify_info_record()
{ MODIFY_INFO_RECORD* ret = POST_SIMPLE::get_modify_info_record();

  if (!lp_eigen()) lp_eigen = (POST_EIGEN2*)Create_object(LOCAL_POST_COMPUTATION, "eigen2");

  MODIFY_INFO_RECORD* ret_eigen = new MODIFY_INFO_RECORD;
  ret_eigen->ptr=(void*)lp_eigen; ret_eigen->info="eigen2";
  ret->commands.add(ret_eigen);

  return ret;
}

bool POST_TRESCA::verify_info()
{ bool ret = POST_SIMPLE::verify_info();

  lp_eigen->set_post_simple(var_name, scalar, diag);

  return ret;
}

void POST_TRESCA::input_i_need(int dim,ARRAY<STRING>& ret)
{ tsz=TENSOR2::give_symmetric_size(dim);
  lp_eigen->input_i_need(dim, ret);
}

void POST_TRESCA::output_i_give(bool& every_card,ARRAY<STRING>& ret)
{ every_card=TRUE;
  ret.resize(1); ret[0]=var_name+"tresca";
}

void POST_TRESCA::compute(const ARRAY<VECTOR>& in,ARRAY<VECTOR>& out)
{
  ARRAY<VECTOR> eigen_out(!in);
  for( int i=0;i<!in;i++) eigen_out[i].resize(3);
  lp_eigen->compute(in,eigen_out);
  for(int icard=0;icard<!in;icard++)
     out[icard][0]=eigen_out[icard][0]-eigen_out[icard][2];
}