


{"id":397669,"date":"2024-12-16T20:49:04","date_gmt":"2024-12-16T20:49:04","guid":{"rendered":"https:\/\/innovationspace.ansys.com\/forum\/forums\/topic\/flexible-material-plugin-issue\/"},"modified":"2024-12-16T20:49:04","modified_gmt":"2024-12-16T20:49:04","slug":"flexible-material-plugin-issue","status":"publish","type":"topic","link":"https:\/\/innovationspace.ansys.com\/forum\/forums\/topic\/flexible-material-plugin-issue\/","title":{"rendered":"Flexible Material Plugin Issue"},"content":{"rendered":"<p>&lt;div class=&#8221;x_elementToProof&#8221; data-olk-copy-source=&#8221;MessageBody&#8221;&gt;Good Afternoon,&lt;\/div&gt;&lt;div class=&#8221;x_elementToProof&#8221;&gt;&nbsp;&lt;\/div&gt;&lt;div class=&#8221;x_elementToProof&#8221;&gt;I am a Post Doc at the University of Toronto in the Department of ECE in the Amr Helmy group.&nbsp; We have a department Ansys account.&nbsp; I am looking to adapt a flexible material plugin for Two Photon Absorption (TPA) based on C++ that was originally developed by the following source &#8220;Integrated Nanoplasmonic Waveguides and Devices for All-Optical Nanocircuitry&#8221; as recommended on a previous Ansys Forum post.&nbsp; There are 3 files in the appendix of the thesis and I have attached them all.&nbsp; I understand I need a .dll file in the material plugin folder for this to work in Lumerical.&nbsp; However none of the 3 files seems to generate a .dll file or us a main{} function in the code which is required in C++.&nbsp; Is there a &#8220;make&#8221; file that I need to do this to generate the .dll file?&nbsp; I am a little confused as to how this work.&nbsp; Any help would be greatly appreciated.&nbsp;&nbsp;&lt;\/div&gt;&lt;div class=&#8221;x_elementToProof&#8221;&gt;&nbsp;&lt;\/div&gt;&lt;div class=&#8221;x_elementToProof&#8221;&gt;Best Regards,&lt;\/div&gt;&lt;div class=&#8221;x_elementToProof&#8221;&gt;&nbsp;&lt;\/div&gt;&lt;div class=&#8221;x_elementToProof&#8221;&gt;Jon Atkinson&lt;\/div&gt;&lt;div class=&#8221;x_elementToProof&#8221;&gt;&nbsp;&lt;\/div&gt;&lt;div class=&#8221;x_elementToProof&#8221;&gt;<strong>Si_TPA.cpp:<\/strong>&lt;\/div&gt;&lt;div class=&#8221;x_elementToProof&#8221;&gt;&nbsp;&lt;\/div&gt;&lt;div class=&#8221;x_elementToProof&#8221;&gt;&lt;div&gt;#include &#8220;SiTPA.h&#8221;&lt;\/div&gt;&lt;div&gt;#include &lt;cmath&gt;&lt;\/div&gt;&lt;div&gt;\/*!&lt;\/div&gt;&lt;div&gt;\\class NSiTPAPlugin&lt;\/div&gt;&lt;div&gt;For studying TPA and free carrier effects in Si in the telecom wavelengths&lt;\/div&gt;&lt;div&gt;around 1.55um.&lt;\/div&gt;&lt;div&gt;Based on the FDTD formulism for TPA and free carrier effects from [1].&lt;\/div&gt;&lt;div&gt;Does not take into account linear absorption and dispersive refractive&lt;\/div&gt;&lt;div&gt;index (assumes you use Si as the base material in Lumerical), and does not&lt;\/div&gt;&lt;div&gt;currently have Kerr or Raman effects (since these&lt;\/div&gt;&lt;div&gt;occur on a different scale than TPA and free carrier effects). All units are&lt;\/div&gt;&lt;div&gt;standard SI.&lt;\/div&gt;&lt;div&gt;[1] N. Suzuki, &#8220;FD-TD Analysis of Two-Photon Absorption and Free&lt;\/div&gt;&lt;div&gt;Carrier Absorption in Si High-Index-Contrast Waveguides,&#8221; Journal of Lightwave&lt;\/div&gt;&lt;div&gt;Technology 25, 2495 (2007).&lt;\/div&gt;&lt;div&gt;*\/&lt;\/div&gt;&lt;div&gt;const double SiTPAPlugin::hbar = 1.05457148e-34; \/\/ [J\/s]&lt;\/div&gt;&lt;div&gt;const double SiTPAPlugin::exp = 0.8; \/\/constant&lt;\/div&gt;&lt;div&gt;const double SiTPAPlugin::eps0 = 8.854187817e-12; \/\/vacuum permitivity [F\/m]&lt;\/div&gt;&lt;div&gt;const double SiTPAPlugin::c = 2.99792458e8; \/\/speed of light [m\/s]&lt;\/div&gt;&lt;div&gt;const double SiTPAPlugin::tau = 1e-12; \/\/free carrier recombination time in&lt;\/div&gt;&lt;div&gt;oxygen doped silicon[s]&lt;\/div&gt;&lt;div&gt;const double SiTPAPlugin::n0 = 3.48; \/\/refractive index of Si at 1.55um&lt;\/div&gt;&lt;div&gt;const double SiTPAPlugin::betaTPA = 0.9e-11; \/\/ [m\/W]&lt;\/div&gt;&lt;div&gt;const double SiTPAPlugin::pi = 3.1415926535897931;&lt;\/div&gt;&lt;div&gt;const double SiTPAPlugin::Nfi = 1.01e16; \/\/[m^-3] intrinsic free carrier density&lt;\/div&gt;&lt;div&gt;of Si&lt;\/div&gt;&lt;div&gt;const char* SiTPAPlugin::names[4] = {&#8220;Peak Intensity of Input Pulse [W\/m^2]&#8221;,&lt;\/div&gt;&lt;div&gt;&#8221;Center Wavelength of Input Pulse [m]&#8221;,&#8221;Initial Free Carrier Concentration [m^- 3]&#8221;, 0};&lt;\/div&gt;&lt;div&gt;void SiTPAPlugin::initialize(const double** parameters, double dt)&lt;\/div&gt;&lt;div&gt;{&lt;\/div&gt;&lt;div&gt;d_t=dt;&lt;\/div&gt;&lt;div&gt;&nbsp; &nbsp; for(int i=0; i&lt;3; i++){&lt;\/div&gt;&lt;div&gt;Ip[i] = double(parameters[0][i]);&lt;\/div&gt;&lt;div&gt;lambda0[i] = float(parameters[1][i]);&lt;\/div&gt;&lt;div&gt;N_initial[i] = double(parameters[2][i]);&lt;\/div&gt;&lt;div&gt;lambda_n[i]=lambda0[i]\/1.55e-6;&lt;\/div&gt;&lt;div&gt;}&lt;\/div&gt;&lt;div&gt;}&lt;\/div&gt;&lt;div&gt;float SiTPAPlugin::calculate(int i, float U, float V, float Et, float* storage)&lt;\/div&gt;&lt;div&gt;{&lt;\/div&gt;&lt;div&gt;double Nf = storage[0];&lt;\/div&gt;&lt;div&gt;double n_plasma_n = storage[1];&lt;\/div&gt;&lt;div&gt;double Vn = storage[2];&lt;\/div&gt;&lt;div&gt;double Un = storage[3];&lt;\/div&gt;&lt;div&gt;double En = double(Et);&lt;\/div&gt;&lt;div&gt;double E = double(Et);&lt;\/div&gt;&lt;div&gt;float firstUpdateDone = storage[4];&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;n=1.;&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;Nf = (2.*tau- d_t)\/(2.*tau+d_t)*Nf+tau*d_t\/(2.*tau+d_t)*lambda0[i]\/2.\/pi\/c\/hbar*betaTPA*Ip[i&lt;\/div&gt;&lt;div&gt;]*Ip[i]*abs(En*En*En*En); \/\/free carrier concentration&lt;\/div&gt;&lt;div&gt;if (firstUpdateDone == 0.) \/\/initial free carrier concentration&lt;\/div&gt;&lt;div&gt;Nf = N_initial[i];&lt;\/div&gt;&lt;div&gt;if (Nf&lt;Nfi) \/\/free carrier concentration cannot drop below intrinsic value&lt;\/div&gt;&lt;div&gt;for silicon&lt;\/div&gt;&lt;div&gt;Nf=Nfi;&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;firstUpdateDone = 1.;&lt;\/div&gt;&lt;div&gt;n_plasma=-8.8e-28*Nf-8.5e- 24*(pow(Nf,exp))*lambda_n[i]*lambda_n[i]; \/\/change in refractive index due to&lt;\/div&gt;&lt;div&gt;plasma dispersion&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;\/\/loop for iterating E field and effect of chi_TPA and chi_FCA. 6&lt;\/div&gt;&lt;div&gt;iterations was determiend to be sufficient for convergence&lt;\/div&gt;&lt;div&gt;while (n&lt;6){&lt;\/div&gt;&lt;div&gt;g1=2*n0*n_plasma+c*n0*(1.45e- 21*lambda_n[i]*lambda_n[i]*Nf)*d_t\/2+c*c*eps0*n0*n0*betaTPA*d_t*(E*E+&lt;\/div&gt;&lt;div&gt;En*En)*Ip[i]\/8;&lt;\/div&gt;&lt;div&gt;g2=2*n0*n_plasma_n-c*n0*(1.45e- 21*lambda_n[i]*lambda_n[i]*Nf)*d_t\/2- c*c*eps0*n0*n0*betaTPA*d_t*(E*E+En*En)*Ip[i]\/8;&lt;\/div&gt;&lt;div&gt;E=1\/(g1+U)*(g2*En+(V-Vn)+Un*En);&lt;\/div&gt;&lt;div&gt;n=n+1;&lt;\/div&gt;&lt;div&gt;}&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;\/\/update storage&lt;\/div&gt;&lt;div&gt;storage[0] = Nf;&lt;\/div&gt;&lt;div&gt;storage[1] = n_plasma;&lt;\/div&gt;&lt;div&gt;storage[2] = V;&lt;\/div&gt;&lt;div&gt;storage[3] = U;&lt;\/div&gt;&lt;div&gt;storage[4] = float(firstUpdateDone);&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;&nbsp; &nbsp; &nbsp;return E;&lt;\/div&gt;&lt;div&gt;}&lt;\/div&gt;&lt;div&gt;float SiTPAPlugin::calculateEx( float U, float V, float Ex, float* storage )&lt;\/div&gt;&lt;div&gt;{&lt;\/div&gt;&lt;div&gt;return calculate(0, U, V, Ex, storage);&lt;\/div&gt;&lt;div&gt;}&lt;\/div&gt;&lt;div&gt;float SiTPAPlugin::calculateEy( float U, float V, float Ey, float* storage )&lt;\/div&gt;&lt;div&gt;{&lt;\/div&gt;&lt;div&gt;return calculate(1, U, V, Ey, storage);&lt;\/div&gt;&lt;div&gt;}&lt;\/div&gt;&lt;div&gt;float SiTPAPlugin::calculateEz( float U, float V, float Ez, float* storage )&lt;\/div&gt;&lt;div&gt;{&lt;\/div&gt;&lt;div&gt;return calculate(2, U, V, Ez, storage);&lt;\/div&gt;&lt;div&gt;}&lt;\/div&gt;&lt;div&gt;MATERIAL_PLUGIN(SiTPAPlugin);&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;<strong>Si_TPA.h:<\/strong>&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;&lt;div&gt;#ifndef _SITPA_H&lt;\/div&gt;&lt;div&gt;#define _SITPA_H&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;#include &#8220;imaterialplugin.h&#8221;&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;class SiTPAPlugin : public IMaterialPlugin&lt;\/div&gt;&lt;div&gt;{&lt;\/div&gt;&lt;div&gt;public:&lt;\/div&gt;&lt;div&gt;SiTPAPlugin(){};&lt;\/div&gt;&lt;div&gt;virtual ~SiTPAPlugin(){};&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;const char* name() const {return &#8220;SiTPA&#8221;;};&lt;\/div&gt;&lt;div&gt;const char* uniqueId() const {return &#8220;{CFE9991C-6837-46a2-BBB4- E9EABD833DFC}&#8221;;};&lt;\/div&gt;&lt;div&gt;const char** parameterNames() const {return names;};&lt;\/div&gt;&lt;div&gt;float calculateEx( float U, float V, float Ex, float* storage);&lt;\/div&gt;&lt;div&gt;float calculateEy( float U, float V, float Ey, float* storage);&lt;\/div&gt;&lt;div&gt;float calculateEz( float U, float V, float Ez, float* storage);&lt;\/div&gt;&lt;div&gt;void initialize(const double** parameters, double dt);&lt;\/div&gt;&lt;div&gt;void initializeStorageEx(float* storage){};&lt;\/div&gt;&lt;div&gt;void initializeStorageEy(float* storage){};&lt;\/div&gt;&lt;div&gt;void initializeStorageEz(float* storage){};&lt;\/div&gt;&lt;div&gt;size_t storageSizeE() const {return 5;}; \/\/# of additional storage fields&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;private:&lt;\/div&gt;&lt;div&gt;float calculate(int axis, float U, float V, float E, float* storage);&lt;\/div&gt;&lt;div&gt;void initializeStorageE(int axis, float* storage);&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;static const double hbar;&lt;\/div&gt;&lt;div&gt;static const double eps0;&lt;\/div&gt;&lt;div&gt;static const double tau;&lt;\/div&gt;&lt;div&gt;static const double betaTPA;&lt;\/div&gt;&lt;div&gt;static const double n0;&lt;\/div&gt;&lt;div&gt;static const double exp;&lt;\/div&gt;&lt;div&gt;static const double c;&lt;\/div&gt;&lt;div&gt;static const double pi;&lt;\/div&gt;&lt;div&gt;static const double Nfi;&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;double Ip[3];&lt;\/div&gt;&lt;div&gt;double N_initial[3];&lt;\/div&gt;&lt;div&gt;double lambda0[3];&lt;\/div&gt;&lt;div&gt;double Nf[3];&lt;\/div&gt;&lt;div&gt;double g1;&lt;\/div&gt;&lt;div&gt;double g2;&lt;\/div&gt;&lt;div&gt;double n_plasma;&lt;\/div&gt;&lt;div&gt;double n_plasma_n;&lt;\/div&gt;&lt;div&gt;double d_t;&lt;\/div&gt;&lt;div&gt;float n;&lt;\/div&gt;&lt;div&gt;float lambda_n[3];&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;static const char* names[4];&lt;\/div&gt;&lt;div&gt;};&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;#endif&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;<strong>immaterialplugin:<\/strong>&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;&lt;div&gt;#ifndef _IMATERIALPLUGIN_H&lt;\/div&gt;&lt;div&gt;#define _IMATERIALPLUGIN_H&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;#include &lt;stddef.h&gt;&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;\/*!&lt;\/div&gt;&lt;div&gt;\\brief The interface class definition for a material plugin for FDTD Solutions&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;This pure abstract class defines the methods that must be implemented to create&lt;\/div&gt;&lt;div&gt;a plugin material in FDTD Solutions. A class that inherits from this interface class&lt;\/div&gt;&lt;div&gt;and implements all the methods can be compiled into a dynamic library that can&lt;\/div&gt;&lt;div&gt;be loaded into FDTD Solutions to define new materials.&lt;\/div&gt;&lt;div&gt;*\/&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;class IMaterialPlugin&lt;\/div&gt;&lt;div&gt;{&lt;\/div&gt;&lt;div&gt;public:&lt;\/div&gt;&lt;div&gt;virtual ~IMaterialPlugin(){};&lt;\/div&gt;&lt;div&gt;virtual const char* name() const = 0;&lt;\/div&gt;&lt;div&gt;virtual const char* uniqueId() const = 0;&lt;\/div&gt;&lt;div&gt;virtual const char** parameterNames() const = 0;&lt;\/div&gt;&lt;div&gt;virtual float calculateEx( float U, float V, float Ex, float* storage) = 0;&lt;\/div&gt;&lt;div&gt;virtual float calculateEy( float U, float V, float Ey, float* storage) = 0;&lt;\/div&gt;&lt;div&gt;virtual float calculateEz( float U, float V, float Ez, float* storage) = 0;&lt;\/div&gt;&lt;div&gt;virtual void initialize(const double** parameters, double dt) = 0;&lt;\/div&gt;&lt;div&gt;virtual void initializeStorageEx(float* storage) = 0;&lt;\/div&gt;&lt;div&gt;virtual void initializeStorageEy(float* storage) = 0;&lt;\/div&gt;&lt;div&gt;virtual void initializeStorageEz(float* storage) = 0;&lt;\/div&gt;&lt;div&gt;virtual size_t storageSizeE() const = 0;&lt;\/div&gt;&lt;div&gt;};&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;\/*!&lt;\/div&gt;&lt;div&gt;\\brief The interface class for a magnetic material plugin&lt;\/div&gt;&lt;div&gt;This extends the material plugin defined above with a few more methods that&lt;\/div&gt;&lt;div&gt;need to be&lt;\/div&gt;&lt;div&gt;defined for a magnetic material&lt;\/div&gt;&lt;div&gt;*\/&lt;\/div&gt;&lt;div&gt;class IMagneticMaterialPlugin : public IMaterialPlugin&lt;\/div&gt;&lt;div&gt;{&lt;\/div&gt;&lt;div&gt;public:&lt;\/div&gt;&lt;div&gt;virtual float calculateHx( float U, float V, float Ex, float* storage) = 0;&lt;\/div&gt;&lt;div&gt;virtual float calculateHy( float U, float V, float Ey, float* storage) = 0;&lt;\/div&gt;&lt;div&gt;virtual float calculateHz( float U, float V, float Ez, float* storage) = 0;&lt;\/div&gt;&lt;div&gt;virtual void initializeStorageHx(float* storage) = 0;&lt;\/div&gt;&lt;div&gt;virtual void initializeStorageHy(float* storage) = 0;&lt;\/div&gt;&lt;div&gt;virtual void initializeStorageHz(float* storage) = 0;&lt;\/div&gt;&lt;div&gt;virtual size_t storageSizeH() const = 0;&lt;\/div&gt;&lt;div&gt;};&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;\/*!&lt;\/div&gt;&lt;div&gt;\\brief The interface for a factory class that creates and destroys material plugins&lt;\/div&gt;&lt;div&gt;*\/&lt;\/div&gt;&lt;div&gt;class IMaterialPluginFactory{&lt;\/div&gt;&lt;div&gt;public:&lt;\/div&gt;&lt;div&gt;virtual IMaterialPlugin* createInstance()=0;&lt;\/div&gt;&lt;div&gt;virtual void destroyInstance(IMaterialPlugin* i)=0;&lt;\/div&gt;&lt;div&gt;virtual IMagneticMaterialPlugin* toMagneticMaterialPlugin(IMaterialPlugin*p)=0;&lt;\/div&gt;&lt;div&gt;};&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;\/*!&lt;\/div&gt;&lt;div&gt;\\brief A templated implementation of the IMaterialPluginFactory class&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;Plugin authors do not need to write a factory class, they can just use this class.&lt;\/div&gt;&lt;div&gt;It is written&lt;\/div&gt;&lt;div&gt;as a template so that it can be compiled into the plugin easily. This is done in&lt;\/div&gt;&lt;div&gt;the plugin code&lt;\/div&gt;&lt;div&gt;usign the MATERIAL_PLUGIN(T) macro.&lt;\/div&gt;&lt;div&gt;*\/&lt;\/div&gt;&lt;div&gt;template&lt;class T&gt;&lt;\/div&gt;&lt;div&gt;class MaterialPluginFactory : public IMaterialPluginFactory&lt;\/div&gt;&lt;div&gt;{&lt;\/div&gt;&lt;div&gt;IMaterialPlugin* createInstance(){return new T();}&lt;\/div&gt;&lt;div&gt;void destroyInstance(IMaterialPlugin* i){delete i;}&lt;\/div&gt;&lt;div&gt;IMagneticMaterialPlugin* toMagneticMaterialPlugin(IMaterialPlugin*&lt;\/div&gt;&lt;div&gt;p){return dynamic_cast&lt;IMagneticMaterialPlugin*&gt;(p);}&lt;\/div&gt;&lt;div&gt;};&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;#ifdef WIN32&lt;\/div&gt;&lt;div&gt;#define DLLEXPORT __declspec(dllexport)&lt;\/div&gt;&lt;div&gt;#else&lt;\/div&gt;&lt;div&gt;#define DLLEXPORT&lt;\/div&gt;&lt;div&gt;#endif&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;\/\/A macro to add the factory function to the plugin, instantiating the&lt;\/div&gt;&lt;div&gt;MaterialPluginFactory in the process&lt;\/div&gt;&lt;div&gt;\/\/All plugins should include this macro once in a source file. The argument T is&lt;\/div&gt;&lt;div&gt;the name of the user&#8217;s plugin class&lt;\/div&gt;&lt;div&gt;#define MATERIAL_PLUGIN(T) \\&lt;\/div&gt;&lt;div&gt;&nbsp; &nbsp;extern &#8220;C&#8221; DLLEXPORT IMaterialPluginFactory* createFactoryV1(){ return&lt;\/div&gt;&lt;div&gt;new MaterialPluginFactory&lt;T&gt;();} \\&lt;\/div&gt;&lt;div&gt;&nbsp; &nbsp;extern &#8220;C&#8221; DLLEXPORT void destroyFactoryV1(IMaterialPluginFactory* f){&lt;\/div&gt;&lt;div&gt;delete f;}&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;div&gt;#endif&lt;\/div&gt;&lt;\/div&gt;&lt;div&gt;&nbsp;&lt;\/div&gt;&lt;\/div&gt;&lt;\/div&gt;<\/p>\n","protected":false},"template":"","class_list":["post-397669","topic","type-topic","status-publish","hentry"],"aioseo_notices":[],"acf":[],"custom_fields":[{"0":{"_bbp_forum_id":["27833"],"_bbp_topic_id":["397669"],"_bbp_subscription":["10770","14496","465406"],"_bbp_author_ip":["142.150.242.144"],"_bbp_last_reply_id":["405344"],"_bbp_last_active_id":["405344"],"_bbp_last_active_time":["2025-01-17 03:30:45"],"_bbp_reply_count":["5"],"_bbp_reply_count_hidden":["0"],"_bbp_voice_count":["3"],"_bbp_engagement":["10770","14496","465406"],"_btv_view_count":["178"],"_bbp_topic_status":["unanswered"]},"test":"jonathan-atkinsonutoronto-ca"}],"_links":{"self":[{"href":"https:\/\/innovationspace.ansys.com\/forum\/wp-json\/wp\/v2\/topics\/397669","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/innovationspace.ansys.com\/forum\/wp-json\/wp\/v2\/topics"}],"about":[{"href":"https:\/\/innovationspace.ansys.com\/forum\/wp-json\/wp\/v2\/types\/topic"}],"version-history":[{"count":0,"href":"https:\/\/innovationspace.ansys.com\/forum\/wp-json\/wp\/v2\/topics\/397669\/revisions"}],"wp:attachment":[{"href":"https:\/\/innovationspace.ansys.com\/forum\/wp-json\/wp\/v2\/media?parent=397669"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}