Skip to main content
Fix syntax error
Source Link
Carl Woll
  • 131.7k
  • 6
  • 246
  • 359

I'm trying to use Mathematica for building complex derivatives for my Fortran code. Therefore I have to do some wild string replacements to make that work. Anyway, I got quite far already but now it would come in handy if I could automatically overwrite let's say the Power method.

What I want is that Mathematica should replace e.g. x^(1/4) with x**z14 on FortranForm. What does work is this:

i=1;
j=4;
Unprotect[Power];
Power /: Format[Power[x_, i/j], FortranForm]:=x^ToExpression["z" <> ToString[i] <> ToString[j]]  
Protect[Power];

ToString[Power[x, i/j], FortranForm]

This will give x**z14 as expected.

If I try to automate the process for more fractions

Unprotect[Power];
For[i = 1, i <= 9, i++,
 For[j = 1, j <= 9, j++,
  If[j > 1 && j != i && Mod[i, j] != 0,
    Power /: Format[Power[x_, i/j], FortranForm]:=x^ToExpression["z"<> ToString[i] <> ToString[j]];
    ,Null
   ]
  ]
 ]
]
Protect[Power];

ToString[Power[x, i/j], FortranForm]

I get x**z1010 instead?

Can anyone help me and tell me what I'm doing wrong? Or is this even possible?

Thanks!

I'm trying to use Mathematica for building complex derivatives for my Fortran code. Therefore I have to do some wild string replacements to make that work. Anyway, I got quite far already but now it would come in handy if I could automatically overwrite let's say the Power method.

What I want is that Mathematica should replace e.g. x^(1/4) with x**z14 on FortranForm. What does work is this:

i=1;
j=4;
Unprotect[Power];
Power /: Format[Power[x_, i/j], FortranForm]:=x^ToExpression["z" <> ToString[i] <> ToString[j]]  
Protect[Power];

ToString[Power[x, i/j], FortranForm]

This will give x**z14 as expected.

If I try to automate the process for more fractions

Unprotect[Power];
For[i = 1, i <= 9, i++,
 For[j = 1, j <= 9, j++,
  If[j > 1 && j != i && Mod[i, j] != 0,
    Power /: Format[Power[x_, i/j], FortranForm]:=x^ToExpression["z"<> ToString[i] <> ToString[j]];
    ,Null
   ]
  ]
 ]
]
Protect[Power];

ToString[Power[x, i/j], FortranForm]

I get x**z1010 instead?

Can anyone help me and tell me what I'm doing wrong? Or is this even possible?

Thanks!

I'm trying to use Mathematica for building complex derivatives for my Fortran code. Therefore I have to do some wild string replacements to make that work. Anyway, I got quite far already but now it would come in handy if I could automatically overwrite let's say the Power method.

What I want is that Mathematica should replace e.g. x^(1/4) with x**z14 on FortranForm. What does work is this:

i=1;
j=4;
Unprotect[Power];
Power /: Format[Power[x_, i/j], FortranForm]:=x^ToExpression["z" <> ToString[i] <> ToString[j]]  
Protect[Power];

ToString[Power[x, i/j], FortranForm]

This will give x**z14 as expected.

If I try to automate the process for more fractions

Unprotect[Power];
For[i = 1, i <= 9, i++,
 For[j = 1, j <= 9, j++,
  If[j > 1 && j != i && Mod[i, j] != 0,
    Power /: Format[Power[x_, i/j], FortranForm]:=x^ToExpression["z"<> ToString[i] <> ToString[j]];
    ,Null
  ]
 ]
]
Protect[Power];

ToString[Power[x, i/j], FortranForm]

I get x**z1010 instead?

Can anyone help me and tell me what I'm doing wrong? Or is this even possible?

Thanks!

Source Link

Automatically change format of protected methods

I'm trying to use Mathematica for building complex derivatives for my Fortran code. Therefore I have to do some wild string replacements to make that work. Anyway, I got quite far already but now it would come in handy if I could automatically overwrite let's say the Power method.

What I want is that Mathematica should replace e.g. x^(1/4) with x**z14 on FortranForm. What does work is this:

i=1;
j=4;
Unprotect[Power];
Power /: Format[Power[x_, i/j], FortranForm]:=x^ToExpression["z" <> ToString[i] <> ToString[j]]  
Protect[Power];

ToString[Power[x, i/j], FortranForm]

This will give x**z14 as expected.

If I try to automate the process for more fractions

Unprotect[Power];
For[i = 1, i <= 9, i++,
 For[j = 1, j <= 9, j++,
  If[j > 1 && j != i && Mod[i, j] != 0,
    Power /: Format[Power[x_, i/j], FortranForm]:=x^ToExpression["z"<> ToString[i] <> ToString[j]];
    ,Null
   ]
  ]
 ]
]
Protect[Power];

ToString[Power[x, i/j], FortranForm]

I get x**z1010 instead?

Can anyone help me and tell me what I'm doing wrong? Or is this even possible?

Thanks!