1 Are variables like SQ private to a given thread in routines at the AMF level?
I would start by using IMPLICIT NONE and explicit declaration of every variable. Having said that, SQ is a local variable so yes, every thread has its own (private) SQ.
2 Is there any potential problem with the local variable SQ in AMF...?
I think there is no problem on SQ unless you declare it as saved (which is not the case with the current code, I think).
2... I assume that I need to move EFPOR out of COMMON?
In general, I would suggest avoiding COMMON in parallel code, so if you are able "to move EFPOR out of COMMON" I think you avoid a lot of trouble. If COMMON blocks are not possible to avoid, then you should see the how to synchronize the writes on shared data to avoid race conditions.
a) AMF is the "complex_subroutine" called in parallel by different threads, right?
b) take care with dummy arguments, e.g. H in AMF is assigned a value inside the function, so you should make sure that H is private to the thread calling AMF...